如何在特定时间内运行线程并在时间过去时返回一些结果?
到目前为止,我能想到的最好的解决方案是手动测量时间。但也许有更优雅、开箱即用的解决方案?
我有一个算法,可以在每次迭代中改进以前的解决方案。我想在预定义的时间内在单独的线程中运行此代码。当时间过去时,应该返回最好的(最新的)解决方案。
由于我想返回解决方案,我不能只使用Future#get(long timeout, TimeUnit unit)
- 它会导致TimeoutException
. 在“控制”线程一段时间后中断线程也是如此 - 在这种情况下,Future
将被取消并返回null
。
我目前的解决方案如下:
定时器逻辑:
private class ExecutionTimer {
private final long executionTimeLimit;
private long startTime;
// accepts execution time limit in _miliseconds_
public ExecutionTimer(final int executionTimeLimit) {
this.executionTimeLimit = TimeUnit.MILLISECONDS.toNanos(executionTimeLimit);
}
public void start() {
this.startTime = System.nanoTime();
}
public boolean hasElapsed() {
return (System.nanoTime() - startTime) >= executionTimeLimit;
}
}
...和工作线程:
private class WorkerThread implements Callable<Double> {
private final ExecutionTimer executionTimer;
public WorkerThread(final int executionTimeLimit) {
this.executionTimer = new ExecutionTimer(executionTimeLimit);
}
@Override
public Double call() throws Exception {
executionTimer.start();
double partialSolution = 0;
while (!executionTimer.hasElapsed()) {
// let's imagine that here solution is improved ;)
partialSolution = new Random().nextDouble();
}
return partialSolution;
}
}
编辑: 工作线程可以无限期地工作而不会从外部中断它 - 这很好,因为算法总是可以改进以前的解决方案(当然经过一些显着的时间改进相对较小)