所有线程完成后退出Java程序

时间:2012-11-06 17:26:15

标签: java multithreading runtime

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

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

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

4 个答案:

答案 0 :(得分:1)

您可以使用Runtime.addShutdownHook()注册应在JVM关闭之前运行的代码。

OR

您可以使用Thread.join()等待一个帖子。

答案 1 :(得分:1)

您有几种选择:

  1. 在致电System.exit()之前,请在每个主题上调用thread.join()
  2. 让主线程从System.exit()函数返回,而不是调用main()。这将等待所有非守护程序线程在进程关闭之前终止。

答案 2 :(得分:1)

您有三种选择:

  1. 启动主题后调用t.join()
  2. 使用t.run()代替t.start()
  3. 通过Runtime.addShutdownHook将保存线程添加为关闭挂钩。
  4. 选项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());
    

    当应用程序关闭时它会自动运行。

答案 3 :(得分: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);
      }
   }
}