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

时间:2013-03-20 03:40:46

标签: java awt windowlistener background-thread swing-app-framework

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

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

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

使用Netbeans Step-Debugger后,我注意到程序执行在应用程序退出之前甚至没有输入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.");
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这可能不是最好的答案,但我注意到,有时候拨打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);
    }
});

也许这会有所帮助。

答案 1 :(得分:0)

我的猜测是你在其他地方有WindowListener正在调用System.exit(),否则你正在做JFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE),其中任何一个都会导致应用立即终止,无论是无论其他线程正在执行。