2

私の問題は、プロセスがクリーンアップするのを待たずに、シャットダウンが早すぎることです。

ただし、シャットダウン スレッドに を追加するwhile(true) Thread.sleep(1000);と、プロセスは正常にクリーンアップされ、明らかにシャットダウンすることはありません。

多くの非デーモンスレッドが完了する前にシャットダウンが完了するため、これは私にとって混乱を招きます。たとえば、main()無限ループが発生し、シャットダウン スレッドが発生しない非常に単純なテスト プログラムを作成した場合、mainいずれにせよ終了します (s のキャッチによる例外トレースは発生しませんInterruptedException)。

したがって、シャットダウンスレッドrunメソッドが完了すると、シャットダウンが発生することがわかります。Futureこの知識から、ポーリングループで終了し、残りのプロセスのシャットダウンが成功したことを示すa をポーリングすることで、これを修正できると思います。しかし、これは間違っているようです。デーモン以外のすべてのスレッドがシャットダウンするのを待ちたいだけであり、ポーリングを行いたくありません。

  1. シャットダウンフックのスレッドのrunメソッドが完了するとシャットダウンが完了するというのは正しいですか?
  2. 実際のシャットダウンタスクが完了するのを待って、シャットダウンを実行するための良い方法は何ですか?
4

2 に答える 2

1

シャットダウン フックのスレッドの run メソッドが完了するとシャットダウンが完了するというのは正しいですか? 実際のシャットダウンタスクが完了するのを待って、シャットダウンを実行するための良い方法は何ですか?

シャットダウン スレッドを非デーモンにする

これで十分でない場合は、コードにバグがあります。終了しないシャットダウンフックが早期に殺されないことを自分で証明できます。

于 2013-07-10T15:24:27.627 に答える