4

興味深い問題に遭遇しました。Java でスレッドが呼び出した場合、 をSystem.exit()介して参加できないようThread.join()です。

アプリケーションの後にシャットダウン フックを使用してクリーンアップしたい場合、次のような問題が発生します。

Runtime.getRuntime.addShutdownHook(new Thread() {
    public void run() {
        reader.join();
        writer.join();
        in.close();
        out.close();
    }
});

アイデアは、スレッドがそれぞれのリソースを終了する前に、それらのリソースを閉じることを保証することです。問題は、シャットダウン フックを呼び出すことができる 3 つの状況があることです。彼らです:

  1. ユーザーが [ctrl] + [C] を押します。
  2. リーダー スレッドが完了し、 を呼び出しますSystem.exit()
  3. 書き込みスレッドが完了し、 を呼び出しますSystem.exit()

ユーザーが [ctrl] + [C] を押す最初のケースは問題なく動作します。しかし、他の 2 つのケースのいずれにおいても、シャットダウン フックは永久にブロックされます。これは、Thread.join()がすでに呼び出されているスレッドに対して呼び出された がSystem.exit()永久にブロックされるという連鎖反応です。

したがって、2つの質問があります。まず、Thread.join(long millis)無期限にブロックしないように代わりに使用できることはわかっていますが、よりエレガントなソリューションを考えられる人はいますか? 第二に、同じスレッドに対して2回呼び出すことができ、2回目はすぐに戻るだけですが、すでにブロックを無期限に呼び出してすぐに返さないスレッドに対してThread.join()呼び出す理由を知っている人はいますか?Thread.join()System.exit()

4

4 に答える 4

1

あなたがしていることは特に禁止されています:

シャットダウン フックもすばやく作業を終了する必要があります。

ランダムなスレッドに参加することは「速い」とは言えません。

明らかに、これらのスレッドは、終了時に独自のストリームを閉じる必要があります。それらが終了しない場合、呼び出しはどのようにjoin()何かを達成しますか?

于 2013-07-19T00:04:03.687 に答える