4

私が継承したコードは、さまざまな種類のデーモン スレッドを生成するサーバーであり受信したリクエストに応答します。明らかに、これは危険であり、リファクタリングする必要があります。現在のように、デーモンの 1 つがリクエストを処理している間にメイン プログラムが停止すると、リクエストの途中でスレッドが強制終了され、何かが矛盾した状態になる可能性があります。

ただし、コードのさまざまな領域にまたがるかなりの数のスレッドがあります。シャットダウンが呼び出されたときにすべてのスレッドを手動で閉じる必要があるとしたら、あいまいなデーモンを見逃すことなく完全なロジック フローを取得するのは少し面倒かもしれません。

代わりに、デーモン スレッドのようなスレッドを作成したいと考えていますが、スレッドの一部のセクションをクリティカル セクションとしてマークまたはトグルすることができます。これにより、therad が完了するまで取得されなくなります。デーモンがリクエストをブロックして待機している間、デーモン スレッドのように動作し、VM の終了を妨げず、VM がシャットダウンしている場合はすぐに停止します。ただし、スレッドが特定の要求をアクティブに処理している間 (スレッドがアクティブな時間の一部)、スレッドは処理を行いません。完了してクリティカルセクションを終了するまで強制終了されます。スレッドが終了すると、それはクリティカル セクションであり、その後、強制終了できるようになります。理想的には、利用可能な非デーモン スレッドがなくなると、VM はシャットダウン プロセスをすぐに開始します。一部のデーモンがまだ重要な作業を行っている場合でも、重要な状態にないデーモンを取得し、残りの各「デーモン」が終了するのを待ちます。それは殺される可能性があるため、重要なポイントです。

このように動作する割り込みを適切に処理するために各スレッドを明示的に記述するのではなく、Thread クラス (おそらく私が作成したもの) をインスタンス化するか、ブール値を設定するだけで、この動作を取得する簡単な方法はありますか? そのようなスレッドで実行されているプラ​​グインが割り込みを完全に処理するように記述されていない場合でも、スレッドはクリティカルセクションを適切に完了し、VM がシャットダウンするときに終了するように、ほとんどばかげた証明方法を探しています。

4

3 に答える 3

5

ただし、コードのさまざまな領域にまたがるかなりの数のスレッドがあります。シャットダウンが呼び出されたときにすべてのスレッドを手動で閉じる必要があるとしたら、あいまいなデーモンを見逃すことなく完全なロジック フローを取得するのは少し面倒かもしれません。

残念ながら、これを行う最善の方法は、あなたが暗示しているとおりです。destroy()スレッドをフォークするクラスにメソッドを用意して、スレッド自体を明示的にクリーンアップできるようにする必要があります。ただし、これには、アプリケーションの終了時に誰かがそれらの destroy メソッドを呼び出す必要があります。

代わりに私がやりたいことは、デーモンスレッドのようなスレッドを持つことですが、完了するまで強制終了できない特定のクリティカルセクションがあります (または、時間がかかりすぎるとタイムアウトになる可能性がありますか?)。

Java スレッドには、この動作を許可するものは何もありません。スレッドがデーモンであるかそうでないかのいずれかであり、これはスレッドの開始前に設定されます。

クラスをインスタンス化するか、ブール値を設定するだけで、この動作を取得する簡単な方法はありますか

あなたはここで何かに取り組んでいると思います。フィールドのあるThreadUtilsクラスがありvolatile boolean shutdownます。

 public class ThreadUtils {
     private static volatile boolean shutdown = false;
     /** called by main when the application is shutting down */
     public static void shutdown() {
         shutdown = true;
     }
     /** used by the various non-daemon threads to test for shutdown */
     public static boolean isShutdown() {
         return shutdown;
     }
 }

メイン プログラムでシャットダウン フラグを true に設定すると、すべてのスレッドがコード内でこのブール値をチェックする必要があります。

 // we can test for shutdown only at "appropriate" points in the thread
 while (!ThreadUtils.isShutdown()) {
     ...
     // we are not ready to be killed here
     ...
 }

このパターンのようなものは、少し大雑把ですが、要件を満たしているように思えます。

于 2013-09-20T17:41:34.377 に答える