1

我有一个密码保存程序,可以将密码保存到文本文件中。用户可以添加或删除密码,数据将被重新写入文本文件。为了防止程序真的很慢,每次程序需要保存时,我都会创建一个新线程。我有一个扩展 Thread 的类,并将所有数据写入指定的文本文件。我遇到的问题是当我尝试在用户想要退出之前保存所有数据时。当按下退出按钮时,我创建一个新线程来保存数据,然后调用 System.exit() 函数退出。

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

我注意到程序将在线程完成之前退出。有什么方法可以告诉java只在我的线程停止运行时退出?

4

4 回答 4

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 回答
1

你有三个选择:

  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 回答
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 回答