Java 等待eclipse rcp应用程序退出时运行作业
我有一个EclipseRCP应用程序,它定期(每5秒)在子线程中执行一些工作。线程执行一个方法来更新应用程序的状态行,以指示工作已完成。 看起来是这样的: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
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不需要存储任何重要内容,那么这一切都是不相关的(只是一条错误消息),但是如果正确执行作业对于应用程序的数据一致性很重要,那么这可能会导致更多的麻烦—工具将在下一次启动