我有一个密码保存程序,可以将密码保存到文本文件中。用户可以添加或删除密码,数据将重新写入文本文件。为了防止程序变得非常慢,我每次程序需要保存时都会创建一个新线程。我有一个扩展Thread的类,并将所有数据写入指定的文本文件。我遇到的问题是当我尝试在用户想要退出之前保存所有数据时。当按下退出按钮时,我创建一个新线程来保存数据,然后调用System.exit()函数退出。
Thread t = new SaveThread();
t.start();
System.exit(0);
我注意到程序将在线程完成之前退出。有什么方法可以告诉java只在我的线程停止运行时才退出?
答案 0 :(得分:1)
答案 1 :(得分:1)
您有几种选择:
System.exit()
之前,请在每个主题上调用thread.join()
。System.exit()
函数返回,而不是调用main()
。这将等待所有非守护程序线程在进程关闭之前终止。答案 2 :(得分:1)
您有三种选择:
t.join()
t.run()
代替t.start()
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());
当应用程序关闭时它会自动运行。
答案 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);
}
}
}