我有一个进行采样的Java方法。 也就是说,它执行以下操作:
TIME = 60 /* seconds */
startTime = now();
count = 0;
while (now() - startTime < TIME) {
sample = createRandomSample();
if (satisfiesSomeConditions(sample)) {
count++;
}
}
return count;
现在,通常,createRandomSample() 和 satisfiesSomeConditions(sample) 运行得非常快(如在一秒或更短的时间内),因此此代码运行良好。
但是,有时,其中一个函数可能需要很长时间才能运行。 我怎样才能控制这个采样过程的运行时间不超过TIME的要求。 我不介意它是否比 TIME 长 10%,但我不希望它在 TIME 上运行任意长的时间。
执行人服务似乎太苛刻了。
这更像是我们想在一个单独的线程上运行采样,然后轻轻地告诉该线程停止采样并给出它当前具有的任何结果。
FutureTask
.像这样:
FutureTask<Void> futureTask = new FutureTask<Void>(new Callable<Void>() {
@Override
public Void call() throws Exception {
doStuff();
return null;
}
});
futureTask.run();
futureTask.get(60, TimeUnit.SECONDS); //handle exceptions
get()
方法在可调用对象完成后终止。如果这种情况发生在超时之前,一切都很好。如果没有,它会抛出一个TimeoutException
在这种情况下你必须抓住。