1

パスワードをテキスト ファイルに保存するパスワード保存プログラムがあります。ユーザーはパスワードを追加または削除でき、データはテキスト ファイルに再書き込みされます。プログラムが非常に遅くならないように、プログラムを保存する必要があるたびに新しいスレッドを作成します。Thread を拡張するクラスがあり、指定されたテキスト ファイルにすべてのデータを書き込みます。私が抱えている問題は、ユーザーが終了する前にすべてのデータを保存しようとするときです。終了ボタンが押されたら、新しいスレッドを作成してデータを保存し、System.exit() 関数を呼び出して終了します。

Thread t = new SaveThread();
t.start();
System.exit(0);

スレッドが完了する前にプログラムが終了することに気付きました。スレッドの実行が停止したときにのみ Java を終了するように指示する方法はありますか?

4

4 に答える 4

1

3つのオプションがあります。

  1. t.join()スレッドを開始した後に呼び出す
  2. t.run()の代わりに使用t.start()
  3. を介して、保存スレッドをシャットダウンフックとして追加しますRuntime.addShutdownHook

オプション1

これは簡単です:

Thread t = new SaveThread();
t.start();
t.join();
System.exit(0);

オプション2

また簡単:

Thread t = new SaveThread();
t.run();
System.exit(0);

オプション3

簡単ですが、アプリケーションの起動時に実行されます。アプリの初期化コードで、次のようにします。

Runtime.getRuntime().addShutdownHook(new SaveThread());

また、アプリケーションが終了すると自動的に実行されます。

于 2012-11-06T17:39:59.587 に答える
1

Runtime.addShutdownHook()JVM がシャットダウンする前に実行する必要があるコードを登録するために使用できます。

また

Thread.join()スレッドを待つために使用できます。

于 2012-11-06T17:30:12.640 に答える
1

いくつかのオプションがあります:

  1. を呼び出す前に、各スレッドで を呼び出しますSystem.exit()thread.join()
  2. を呼び出す代わりにSystem.exit()、メイン スレッドがそのmain()関数から戻るようにします。これは、プロセスがシャットダウンされる前に、すべての非デーモン スレッドが終了するのを待ちます。
于 2012-11-06T17:31:51.920 に答える
0

これSaveThreadが実行する最後のアクションである場合、System.exit()呼び出しをそのスレッドに移動しないのはなぜですか?


合意されたより良い解決策がありますが、このアプローチを使用してこの保存スレッドのインスタンスを複数回使用したい場合は、簡単にパラメーター化できます。

public SaveThread extends Thread {

   private exitAfterSave = false;

   public SaveThread() {
     this(false);
   }

   public SaveThread(boolean exitAfterSave) {
     this.exitAfterSave = exitAfterSave;
   }

   @Overwrite
   public void run() {

      // Save what has to be saved

      if (exitAfterSave) {
        System.exit(0);
      }
   }
}
于 2012-11-06T17:32:26.627 に答える