我有一个可以进行抽样的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之间运行一段任意长的时间。
ExecutorService看起来太苛刻了。
这更像是我们想在一个单独的线程上运行采样,然后轻轻地告诉该线程停止采样并提供它当前的结果。
答案 0 :(得分:1)
您可以使用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
,在这种情况下你必须抓住它。