3

我有一个进行采样的 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 似乎太苛刻了。

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

4

1 回答 1

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你必须在这种情况下捕获的。

于 2012-09-25T19:46:24.683 回答