抱歉标题我真的不知道如何将问题放入标题中,如果有人可以更好地提出问题,请更正它!
所以无论如何,在我的程序中,我有 2 个线程,一个是主程序,运行 GUI 以及与用户有关的所有内容,当它创建时,它创建一个线程,仅用于检查网站以查看是否有任何更新可用到程序使用的 SQLite 数据库,如果有,它会以 JSON 格式提取信息,然后必须使用插入查询更新数据库(这显然是通过围绕数据库解析器的同步方法完成的,以确保用户'在更新数据库时不访问数据)。这一切都很好。
但是,当程序关闭并且主类终止时,更新线程也必须尽快停止,但是它可能需要停止与数据库交互并关闭它,以及中断自身。我认为我需要中断线程并在数据库打开时关闭数据库,但是如何在主线程死后立即触发它?它不使用循环,所以我无法检查 thread1 是否还活着......
这是迄今为止更新程序的重要代码:
public static class AutomaticUpdater extends Thread
{
DictionaryGUI pGUI;
DatabaseParser pParser;
public void run()
{
Updater pUpdater = new Updater (pParser, pGUI, true); //the manual updater is used to process the data
for (String sURL : getURLs()) //getURLS() returns areas in the website that contain relevant data
{
pUpdater.process(getData(sURL)); //create the INSERT statements and send to database
}
}
}
那么当主线程死亡时,我如何确保更新程序死亡?被 JVM 杀死的线程是否会抛出异常或进行任何类型的清理函数调用,我可以覆盖以杀死更新程序并关闭数据库?
编辑:好的,我找到了解决方案,但我仍然愿意接受更好的想法......
这是附加到 GUI 的 JFrame 的:
private class ProgramCleaner implements WindowListener
{
public void windowClosing(WindowEvent e)
{
MainLauncher.pAutoUpdater.kill();
}
public void windowActivated(WindowEvent e) {}
public void windowClosed(WindowEvent e) {}
public void windowDeactivated(WindowEvent e) {}
public void windowDeiconified(WindowEvent e) {}
public void windowIconified(WindowEvent e) {}
public void windowOpened(WindowEvent e) {}
}
其中 kill 中断更新程序并确保数据库已关闭:D
编辑2 :似乎当GUI关闭时,程序几乎总是在所有清理完成后发出InterruptedException ,我用一些调试语句证明了这一点,而且我发送错误的调试文件没有选择它up (即程序完全关闭)并且异常的堆栈跟踪从不谈论我的代码或与此相关的任何内容:
Exception while removing reference: java.lang.InterruptedException
java.lang.InterruptedException
at java.lang.Object.wait(Native Method)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at java.lang.ref.ReferenceQueue.remove(Unknown Source)
at sun.java2d.Disposer.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
有人知道为什么会这样吗?wait 在我的代码中实际上从未被称为,所以它必须是别的东西......