ExecutorService
およびFuture
オブジェクトを使用するとき(Runnable
タスクを送信するとき)、将来のget関数にタイムアウト値を指定すると、TimeoutException
がスローされますか?
ありません。なぜだろうか?言わない限り。
たとえばCallableの場合、ここには非常に有効な懸念事項があります。たとえば、20秒間結果を待ったが、結果が得られなかった場合、その結果にはもう興味がありません。その時点で、タスクをすべてキャンセルする必要があります。
このようなもの:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
いいえ、そうではありません。モーバーは、タスクを中断する試みさえありません。まず、タイムアウト付きのFuture.getはそうは言っていません。次に、テストを試して、それがどのように動作するかを確認します
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
1秒で印刷します
Exception in thread "main" Java.util.concurrent.TimeoutException
at Java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.Java:228)
at Java.util.concurrent.FutureTask.get(FutureTask.Java:91)
at Test1.main(Test1.Java:23)
さらに1秒後、タスクは正常に終了します
finished
タスクを明示的に強制終了、キャンセル、またはシャットダウンする必要があるようです