web-dev-qa-db-ja.com

Futureタイムアウトはスレッドの実行を強制終了しますか

ExecutorServiceおよびFutureオブジェクトを使用するとき(Runnableタスクを送信するとき)、将来のget関数にタイムアウト値を指定すると、TimeoutExceptionがスローされますか?

51
Nico Huysamen

ありません。なぜだろうか?言わない限り。

たとえば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
    }
51
Eugene

いいえ、そうではありません。モーバーは、タスクを中断する試みさえありません。まず、タイムアウト付きの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
16

タスクを明示的に強制終了、キャンセル、またはシャットダウンする必要があるようです

Java ExecutorServiceタスク)からの例外の処理

TimeoutException後にFutureTaskを返すにはどうすればよいですか?

4
gurvinder372