23

アプリケーションを閉じた後もいくつかのスレッドが実行されているため、アプリケーションを閉じる際に問題が発生しています。メインスレッドを強制終了する前に、バックグラウンドで実行されているすべてのスレッドを停止する方法を教えてください。

[編集]

javafx に関する私の質問で、多くの新しい開発者がスレッドの管理の問題に直面していることに気付きました。javafx でのスレッドの管理に関する私の生活を簡素化するために行ったことを共有したいと思います。Android の AsyncTask に基づいて AsyncTask クラスを作成しました。これは、基本的には Android と同じことを謙虚ではあるが効果的な方法で行います。詳細については、Github プロジェクトを参照してください。

4

5 に答える 5

38

これを修正するより良い方法は、Close RequestにEventHandlerを追加することです。

@Override
public void start(Stage primaryStage) {
    primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>() {
       @Override
       public void handle(WindowEvent e) {
          Platform.exit();
          System.exit(0);
       }
    });
}
于 2013-12-04T11:54:09.803 に答える
37

ここには3つのオプションがあります。最も簡単なのは、スレッドをデーモンとして作成することです。つまり、メインプログラムが終了すると、すべてのデーモンスレッドも終了します。

Thread thread = new Thread();
thread.setDaemon(true);

これは最も簡単ですが、欠点は、正常にシャットダウンされないことです(つまり、スレッドが停止し、リソース管理などを実行する機会が得られないため、問題になる場合と問題がない場合があります)。

別の方法は、生成されたスレッドを保持し、プログラムが閉じるためのシグナルを受信したら、スレッドを繰り返し処理し、スレッドも終了する必要があることを示す何らかのシグナルを渡すことです。

volatile boolean shutdown = false;

public void shutdown() {
   shutdown = true;
}

public void run() {
    while(!shutdown) { 
        ... do your work here
    }
    ... perform any cleanup work here

(注:わかりやすくするために、例外処理は無視されます)

最後のオプションは、java.util.concurrentのExecutorフレームワークを使用することです。

ExecutorService executorService = Executors.newFixedThreadPool(10);
... assign/invoke tasks etc

... at some point later your program is told to shutdown 
... shutdown in executor too 
executorService.shutdown();
executorService.awaitTermination(10, TimeUnit.SECONDS); // wait for 10s in this case
executorService.shutdownNow();
于 2013-02-15T15:01:05.440 に答える