我想强制方法运行指定的时间。
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;
}
这样做的最佳方式是什么?谢谢!
答案 0 :(得分:3)
尝试使用它:
poolExecutor = new ScheduledThreadPoolExecutor(1);
poolExecutor.scheduleAtFixedRate(
new YourRunable(), startFrom/*10*/, startEvery/*5*/, TimeUnit.SECONDS);
答案 1 :(得分:2)
runImpl应返回一个布尔值,以使此代码生效。如果您不希望程序在完成之前停止运行,您可能会想要在新的Thread(基本教程)中使用它。
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;
这会运行每个处理器时刻,如果您希望它运行间隔为AS WELL,运行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;
答案 2 :(得分:1)
最好的方法是让你的工作成适当大小的块,所以每个块可以在1秒内完成。这样,在每个块的末尾,您可以检查时间是否已过去。
如果您的工作涉及可以无限期阻止的I / O工作,请尝试使用可中断的方法(可以通过调用Thread.interrupt()
来中断)或接受来自调用者的显式最大运行时间的方法。 />
或者您可以将I / O工作委托给某个专用线程并在单独的线程中检查它的进度,并在超出运行时间时采取适当的行动。
答案 3 :(得分:0)
您可以启动一个只调用您的方法的新线程,并在您创建的计时器到期后将其置于休眠状态。虽然你不能保证方法循环在挂起之前已经完成,但是不必修改方法就可以了。为了实现循环,只需将此逻辑放入线程循环中即可。只记得唤醒线程
可能有很多实现,因为你没有说清楚。