特定の時間スレッドを実行し、時間が経過したときに何らかの結果を返すにはどうすればよいですか?
これまで考えられる最善の解決策は、時間を手動で測定することです。しかし、もっとエレガントな、すぐに使えるソリューションがあるのではないでしょうか。
各反復で以前のソリューションを改善するアルゴリズムがあります。このコードを別のスレッドで事前定義された時間実行したいと思います。時間が経過すると、最良の(最新の)ソリューションが返されます。
ソリューションを返したいので、単に使用することはできません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;
}
}
編集: ワーカースレッドは、外部から中断することなく無期限に動作できます-アルゴリズムは常に以前のソリューションを改善できるため、問題ありません(もちろん、かなりの時間が経過した後の改善は比較的小さいです)