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

Java 等待eclipse rcp应用程序退出时运行作业,java,multithreading,eclipse-rcp,jobs,Java,Multithreading,Eclipse Rcp,Jobs,我有一个EclipseRCP应用程序,它定期(每5秒)在子线程中执行一些工作。线程执行一个方法来更新应用程序的状态行,以指示工作已完成。 看起来是这样的: protected void updateStatusBar() { Display.getDefault().asyncExec(new Runnable() { @Override public void run() { PlatformUI.getWorkbench

我有一个EclipseRCP应用程序,它定期(每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作业,这样我就可以确保在关闭应用程序之前完成这些作业?

异常消息似乎表明您在关机期间安排了
setMessage
,因此可能会在代码前面加上类似于
if(PlatformUI.getWorkbench().isClosing())return的前缀应该有帮助。

否则,请尝试将
asyncExec
更改为
syncExec
,以查看问题是否消失。

只需按消息所述执行即可:

“作业应该由在运行期间计划作业的插件取消 关闭”

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

你可能会收到比上面更糟糕的消息,但由于这是一次关机,许多人倾向于忽略这些消息。例如,假设您的插件A使用插件B中尚未加载的类。系统关闭:首先它将
stop()
A,然后它将
stop()
B。如果您现在计划任务,您将获得B中类的
ClassNotFound

如果您的Eclipse不需要存储任何重要内容,那么这一切都是不相关的(只是一条错误消息),但是如果正确执行作业对于应用程序的数据一致性很重要,那么这可能会导致更多的麻烦—工具将在下一次启动