2

私は現在、多くの異なるタスクを実行するデーモンに取り組んでいます。マルチスレッドであり、クラッシュすることなく、ほぼすべての種類の内部エラーを処理するように構築されています。さて、シャットダウン要求を処理するところまで来ましたが、どうすればよいかわかりません。

私はシャットダウンフックをセットアップしており、それが呼び出されると、メインデーモンループに実行を停止するように指示する変数を設定します。問題は、このデーモンが複数のスレッドを生成し、長い時間がかかることです。たとえば、これらのスレッドの 1 つがドキュメントを変換している可能性があります。それらのほとんどは高速ですが (10 秒未満だと思います)、10 分以上続くスレッドもあります。

私が今考えているのは、シャットダウン フックが送信されたとき、500 ミリ秒 (またはそれくらい) のスリープ (これらのスレッドはすべて ThreadGroup 内にあります) で ThreadGroup.activeCount() で 5 秒ほどループを実行することです。このループで、シャットダウン要求が呼び出されたことを知らせる通知をすべてのスレッドに送信します。次に、クリーンアップとシャットダウンを行っていることに関係なく、即座に実行する必要があります。

他に何か提案はありますか?たとえばMySQLのようなデーモンが停止するように言われたときに何をするかに興味があります。それは即座に停止します。非常に遅い 10 個のクエリが呼び出されている場合はどうなりますか? それは待つか、それとも単にそれらを終了しますか。つまり、サーバーは非常に高速なので、1 秒以内に実行できない操作はありません。現在、1000ミリ秒で多くのことができます。

ありがとう

4

2 に答える 2

2

このjava.util.concurrentパッケージは、(クラスの他の実装ThreadPoolExecutorのさまざまな特殊なタイプと共に)や などの多くのユーティリティを提供します。これらは、実装しようとしているのとまったく同じ機能を提供するため、調べたいと思うかもしれません。このようにして、スレッドやタスクのスケジューリングなどを心配する代わりに、アプリケーション/タスクの実際の機能の実装に集中できます。ExecutorExecutorsThreadPoolExecutor.awaitTermination()

于 2009-12-07T23:30:23.290 に答える
1

スレッド ジョブは を介し​​て中断できThread#interrupt()ますか? 彼らは主に、それ自体が throwing を宣伝する関数を呼び出しInterruptedExceptionますか? もしそうなら、前述java.util.concurrent.ExecutorService#shutdownNow()の方法が有効です。実行中のスレッドを中断し、開始されていないジョブのリストを返します。

同様に、Futureによって生成された sに固執する場合は、とExecutorService#submit()を使用して、実行中のジョブを中断するように要求できます。Future#cancel(boolean)true

InterruptedException割り込みシグナルを飲み込む (たとえば、を呼び出さずにキャッチすることによって) 制御できないコードを呼び出していない限りThread.currentThread().interrupt()、組み込みの協調割り込み機能を使用することは、独自のフラグを導入して既に存在するものを概算するよりも優れた選択です。

于 2009-12-08T01:23:57.877 に答える