Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 强制方法在指定的时间间隔内运行_Java - Fatal编程技术网

Java 强制方法在指定的时间间隔内运行

Java 强制方法在指定的时间间隔内运行,java,Java,我想强制方法在指定的时间内运行 public Response run(Request req){ //method runImpl must run during specified interval of time(for example for 10 secs) Response res = runImpl(req); return response; } 最好的方法是什么?谢谢 最好的方法是将您的工作分成大小合适的块,这样每个块都可以在1秒内完成。这样

我想强制方法在指定的时间内运行

 public Response run(Request req){
    //method runImpl must run during specified interval of time(for example for 10 secs)
    Response res = runImpl(req);
    return response;
    }

最好的方法是什么?谢谢

最好的方法是将您的工作分成大小合适的块,这样每个块都可以在1秒内完成。这样,在每个块的末尾,您可以检查时间是否已过

如果您的工作涉及可以无限期阻塞的I/O工作,请尝试使用可中断方法(可以通过调用
Thread.interrupt()
)或接受调用者显式最大运行时间的方法。
或者,您可以将I/O工作委派给某个专用线程,并在单独的线程中检查其进度,并在超过运行时间时采取适当的行动。

尝试使用以下方法:

poolExecutor = new ScheduledThreadPoolExecutor(1);
poolExecutor.scheduleAtFixedRate(
        new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS);

您可以启动一个只调用您的方法的新线程,并在创建的计时器过期后将其置于睡眠状态。这样虽然不能保证方法循环在挂起之前已经完成,但可以在不修改方法的情况下完成。要实现循环,只需将这种休眠逻辑放在线程的循环中。只要记住唤醒线程


由于您的解释不够清楚,可能有几十种实现。

runImpl应该返回一个布尔值,此代码才能工作。如果你不想让你的程序在完成之前停止运行,你可能会希望它出现在一个新的线程中(基本教程比比皆是)

public Response run(Request req){
long lasttime=Sys.getTime();
int i=0;
while(i<10){
   if(Response res = runImpl(req);){
   return response;
   }
   if((Sys.getTime-lasttime)>1000){
   i++;
   lasttime=Sys.getTime();
   }
}
return null;
公共响应运行(请求请求){
long lasttime=Sys.getTime();
int i=0;
而(i1000){
i++;
lasttime=Sys.getTime();
}
}
返回null;
这会在每一个处理器时刻运行,如果您希望它以一个间隔运行并运行10秒,请使用:

public Response run(Request req){
long lasttime=Sys.getTime();
int i=0;
for(int i; i<(10000/yourchoiceinterval); i++){
   if(Response res = runImpl(req);){
   return response;
   }
   if((Sys.getTime-lasttime)>1000){
   lasttime=Sys.getTime();
   }
}
return null;
公共响应运行(请求请求){
long lasttime=Sys.getTime();
int i=0;
用于(int i;i1000){
lasttime=Sys.getTime();
}
}
返回null;

实施加速循环?“在指定的时间间隔内运行”是什么意思?是否应在该时间间隔内完成?只有在那段时间之后才能回来?在该时间间隔内被连续调用?您在此处使用的“during”一词非常混乱。您希望此函数在某个时间间隔上循环,暂停进程直到10秒过去,还是在10秒过去但未完成时中断?我的意思是,如果时间间隔等于10秒,函数在此时间段后停止执行并返回null。也许我可以用线程类?是的,就是这个。我就是这个意思!这并没有强制执行runnable最多运行X秒-它的目的是在N秒内启动runnable,并每M秒重新调用一次。如果在某个块执行过程中函数“挂起”,该怎么办?@Martin我假设没有任何步骤可以“挂起”,概率是合理的。如果存在这样的步骤,例如网络I/O,请使用一个线程进行I/O,另一个线程检查I/O进度,并在需要时尽快中止I/O。