3

今日、スレッドパターンについて質問を投稿しましたが、ほとんどの人がExecutorServiceを調べることを提案しました。

ExecutorServiceを調べていたところ、何かが足りないと思います。サービスに実行中またはブロックされたスレッドがあり、誰かがExecutorService.shutdown()を呼び出した場合はどうなりますか。実行中またはブロックされているスレッドはどうなりますか?

ExecutorServiceは、それらのスレッドが完了するのを待ってから終了しますか?

私がこれを尋ねる理由は、私がJavaに手を出したとき、Thread.stop()が非推奨になったためです。スレッドを停止する正しい方法は、必要に応じてsempahoresを使用してThreadを拡張することでした。

public void run () {
    while (!this.exit) {
        try {
            block();
            //do something
        } catch (InterruptedException ie) {
        }
    }
}

public void stop () {
    this.exit = true;

    if (this.thread != null) {
        this.thread.interrupt();
        this.thread = null;
    }
}

ExecutorServiceは実行中のスレッドをどのように処理しますか?

4

2 に答える 2

9

差出人ExecutorService#shutdown()

以前に送信されたタスクが実行される正常なシャットダウンを開始しますが、新しいタスクは受け入れられません。すでにシャットダウンしている場合、呼び出しによる追加の効果はありません。

したがって、それらのスレッドが完了するのを待ちます。

別の方法はExecutorService#shutdownNow()

アクティブに実行されているすべてのタスクを停止し、待機中のタスクの処理を停止し、実行を待機していたタスクのリストを返します。

アクティブに実行されているタスクの処理を停止するための最善の試み以外の保証はありません。たとえば、通常の実装はを介してキャンセルされるThread.interrupt()ため、割り込みに応答できないタスクは終了しない可能性があります。

Thread#isInterrupted()あなたはあなた自身の中のwhileループで聞く必要があるだけですrun()

于 2010-06-10T21:48:11.533 に答える
1

ドキュメントはかなり明確だと思います!メモリからは、shutdownNow()メソッドで別の方法で指示しない限り、スレッドが完了するまで待機します。

于 2010-06-10T21:47:43.910 に答える