Job found still running after platform shutdown. Jobs should be canceled by the plugin that scheduled them during shutdown: ... ...
-----------------------------
分析发现时程序用的一个UIJob,在workbench非正常关闭时,UIJob还在运行,于是就有了上面的异常,替换成WorkbenchJob,就会正常。
-------
WorkbenchJob时一个专门的UIJob类,和UIJob的主要区别:在允许作业被调度和运行前,WorkbenchJob检测Workbench是否正在运行。
WorkbenchJob它使用作业更改监听器来确保:当作业已经完成时,在WorkbenchJob中包含的preformDone方法也被调用。
WorkbenchJob是UIJob的一种更安全的形式。WorkbenchJob会自己检测Workbench是否在运行,当Workbench关闭时,WorkbenchJob强制终止用户界面的更新。
WorkbenchJob源码贴一下:(关键是本身对PlatformUI.isWorkbenchRunning()的调用)
public abstract class WorkbenchJob extends UIJob { public WorkbenchJob(Display jobDisplay, String name) { super(jobDisplay, name); addDefaultJobChangeListener(); } public WorkbenchJob(String name) { super(name); addDefaultJobChangeListener(); } private void addDefaultJobChangeListener() { addJobChangeListener(new JobChangeAdapter() { public void done(IJobChangeEvent event) { //Abort if it is not running if (!PlatformUI.isWorkbenchRunning()) { return; } if (event.getResult().getCode() == IStatus.OK) { performDone(event); } }); } public void performDone(IJobChangeEvent event) { //Do nothing by default. } public boolean shouldSchedule() { return super.shouldSchedule() && PlatformUI.isWorkbenchRunning(); } public boolean shouldRun() { return super.shouldRun() && PlatformUI.isWorkbenchRunning(); } }