为什么WindowClosing处理程序在退出程序之前不执行后台任务


mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt)
    {
        retrieveItems();
        closeAllConnections();
        System.exit(0);
    }
});

对于上面的代码,retrieveItems()执行得很好,但是在closeAllConnections()内部有一个名为doBackup()的后台任务根本没有执行。程序似乎跳过了任务。以下是closeAllConnections()所包含内容的简要视图;

public void closeAllConnections()
{
    boolean shouldBackup = getBackupOnCloseStatus();
    if(shouldBackup)
    {
        doBackUp();
    }
    dbManager.disconnectDB();
}

使用Netbeans步骤调试器后,我注意到程序执行在应用程序退出之前甚至没有进入doBackup()方法。这很奇怪。我将高度感谢任何帮助,关于什么可能导致这种行为。谢谢善良的人们!

只是如果这一块额外的信息可能有助于找到一个解决方案,我使用Swing应用程序框架,所以任务doBackup()看起来像下面…

@Action
public Task doBackUp()
{
    return new DoBackUpTask(getApplication());
}
private class DoBackUpTask extends org.jdesktop.application.Task<Object, Void> 
{
    private boolean done = false;
    DoBackUpTask(org.jdesktop.application.Application app) 
    {
        super(app);
        this.setMessage("Backing-up database...");
    }
    @Override 
    protected Object doInBackground() 
    {
        File destDir = new File(appManager.getBackUpDir());
        done = backUpDataBase(destDir);
        return null;
    }
    @Override 
    protected void succeeded(Object result) 
    {
        if(done)
        {
            setMessage("BackUp completed.");
        }
    }
}

我的猜测是,你在其他地方有另一个WindowListener,调用System.exit()或者你正在做JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),这两种情况都会导致应用程序立即终止,无论其他线程正在执行什么

这可能不是最好的答案,但我注意到,当调用System.exit(0)有时它会切断一切。当调用依赖于前一行结果的方法时,我遇到了一个问题。一切都应该正常,但它没有正常工作,因为它在前一行完成之前执行了下一行。我相信有人可以更多地谈论事件分派线程,以及为什么它似乎发生了,尽管计算机科学的一切都说它不应该发生。但这是我的想法:为closeAllConnections添加一个布尔返回值,以便在完成时返回true,然后像这样重写您的窗口侦听器:

    mainFrame().addWindowListener(new java.awt.event.WindowAdapter() {
    @Override
    public void windowClosing(java.awt.event.WindowEvent evt)
    {
        boolean isClosed = false;
        while(!isClosed){
            retrieveItems();
            isClosed = closeAllConnections();
        }    
        System.exit(0);
    }
});

相关内容

  • 没有找到相关文章

最新更新