0

SwingWorker オブジェクトがあり、それがまだ doInBackground() メソッドにあるとします。ユーザーが system.exit(0) を呼び出した場合...どうすれば SwingWorker デーモン/ワーカー スレッドを確実に完了させることができますか? これを手動で行う必要があると思います。現時点で私が持っている最良のアイデアは、 System.exit(0) を呼び出す同じスレッド内/上のすべての未処理のワーカースレッドで join() を呼び出すことです...これは正しいですか?

そして、join() を使用するのが良い考えである場合... join() を呼び出すスレッドに偽のアクティビティがある場合、何らかの while ループで使用する必要がありますか?

例えば:

//疑似コード

Vector<Thread> threadsThatMustFinishBeforeTerminatingJVM = new Vector<Thread>();

Thread closingThread = new Thread(){


    public void run(){

       for(Thread t: threadsThatMustFinishBeforeTerminatingJVM){

           // closingThread waits for t to finish, (is this *really* safe?)
           t.join();

         }

      System.exit(0);

    }
}

closingThread.start();

これはまったく正しいですか?

4

1 に答える 1

2

こちらをご覧ください

「System.exit メソッドは、Java 仮想マシンのすべてのスレッドを強制的に終了させます。」

system.exit を呼び出すと、基本的には「今すぐ終了します。何が起こっているのかは気にしません」と言っているのです。きれいにシャットダウンしたい場合は、スレッド間の何らかの調整/同期を設定する必要があります。

doInBackground メソッドがまだアクティブな場合は、同期プリミティブ、共有ロックなどを終了する前に完了するまで待つことができます。

SwingWorkerのdone()メソッドに、終了を許可するロジックを追加できます。

おそらくより良い方法は、SwingWorker でgetState()をクエリすることです。タスクが完了した場合は DONE を返します。完了した場合は終了できます。それ以外の場合はそのまま待機します。

于 2013-07-11T21:39:01.487 に答える