等待退出eclipse rcp应用程序时运行作业

时间:2012-04-10 13:53:45

标签: java multithreading eclipse-rcp jobs

我有一个eclipse rcp应用程序,它定期在子线程中执行一些工作(每5秒)。该线程执行一个方法来更新应用程序的状态行以指示工作已完成。 它看起来像这样:

protected void updateStatusBar()
{
     Display.getDefault().asyncExec(new Runnable() {
         @Override
         public void run() {
             PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().findView(MainView.ID).
             getViewSite().getActionBars().getStatusLineManager().setMessage("work finished");   
         }
     });
}

运行正常。我遇到的问题是,当我关闭我的应用程序时,我会不时收到此错误的空指针异常:

  

在平台关闭后仍找到作业。应该通过在关机期间安排它们的插件>取消作业:> org.eclipse.ui.internal.progress.TaskBarProgressManager $ 2

问题是由于异步执行而导致作业正在运行,但同时由于关闭应用程序而导致所有内容都被销毁。那么有没有办法获得/等待正在运行的UI作业,以便我可以确保在应用程序关闭之前完成作业?

2 个答案:

答案 0 :(得分:2)

异常消息似乎表明您在关机期间安排了setMessage,因此可能在代码前加上if (PlatformUI.getWorkbench().isClosing()) return;这样的内容应该有所帮助。 否则,请尝试将asyncExec更改为syncExec以查看问题是否消失。

答案 1 :(得分:0)

按照消息所说的那样做:

  

“作业应该由计划期间的插件取消   关机“

在启动此作业的插件中,在Activator.stop()中,确保您的作业实际退出,并且在完成之前不要继续关闭:等待作业以stop()方法结束。这当然要求您设计计时器作业,使其立即对此取消请求作出反应并终止。

你可以得到比上面更糟糕的消息,但由于它是一个关机,许多人往往忽略这些。例如,假设您的插件A使用了尚未加载的插件B中的类。系统关闭:首先它将stop() A,然后它将stop() B.如果您现在安排任务,您将获得B中的班级ClassNotFound

如果您的Eclipse不需要存储任何重要内容,那么这一切都无关紧要(只是一条错误消息),但如果正确执行您的Job对于应用程序的数据一致性很重要,那么这可能会导致工具更加麻烦下次再开始。