在一定时间内运行采样过程并在Java中返回值

时间:2012-09-25 18:48:58

标签: java timeout process-control

我有一个可以进行抽样的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看起来太苛刻了。

这更像是我们想在一个单独的线程上运行采样,然后轻轻地告诉该线程停止采样并提供它当前的结果。

1 个答案:

答案 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,在这种情况下你必须抓住它。