我有一个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");
}
});
}
它运行良好。我遇到的问题是,当我关闭我的应用程序时,我会不时收到一个空指针异常,并出现此错误:
发现作业在平台关闭后仍在运行。插件应取消作业
问题是,由于异步执行,作业正在运行,但同时由于关闭应用程序,所有内容都被破坏。那么,有没有办法获取/等待正在运行的UI作业,以便我可以确保在关闭应用程序之前完成作业?
照留言上说的做:
“作业应由在关机期间计划作业的插件取消”
在启动此作业的插件的Activator中。stop(),确保作业实际退出,并且在完成之前不要继续关机:等待作业在方法中结束。当然,这需要您设计计时器作业,使其能够立即响应此取消请求并终止。
您可能会收到比上述消息更糟糕的消息,但由于这是一次关机,许多人倾向于忽略这些消息。例如,假设插件A使用插件B中尚未加载的类。系统关闭:首先,它将stop()
A,然后它将stop()
B。如果您现在计划了任务,您将获得B中类的ClassNotFound
。
如果Eclipse不需要存储任何重要内容,那么这一切都是无关紧要的(只是一条错误消息),但是如果正确执行作业对应用程序的数据一致性很重要,那么这可能会导致更多的麻烦,下次启动该工具。
异常消息似乎表明您在关机期间安排了setMessage
,因此可能会在您的代码前面加上类似if(PlatformUI. getWorkbench(). isC0007())的内容返回;
应该会有所帮助。否则,请尝试将asyncExec
更改为syncExec
以查看问题是否消失。
进程退出和等待进程 当进程执行完它的工作后,就需要执行退出操作,释放进程占用的资源。ucore分了两步来完成这个工作,首先由进程本身完成大部分资源的占用内存回收工作,然后由此进程的父进程完成剩余资源占用内存的回收工作。为何不让进程本身完成所有的资源回收工作呢?这是因为进程要执行回收操作,就表明此进程还存在,还在执行指令,这就需要内核栈的空间不能释放,且表示进程存在的进程控制块不能释放。所以需要父进
是否有办法对“应用程序运行失败”做出反应,例如在数据库不可用的情况下? 在我的例子中,所需的行为是退出JVM进程,因此docker容器将自动重新启动 我试着听“ContextClosedEvent”,但它对启动失败案例不起作用。
问题内容: 是否可以编写一个在终止程序时System.exit将调用的方法? 问题答案: 使用。
问题内容: 对于子进程,和函数可用于暂停当前进程的执行,直到子进程退出。但是此功能不能用于非子进程。 是否有另一个函数可以等待任何进程的退出? 问题答案: 什么都不等于。通常的做法是使用轮询,寻找返回值-1和的,表明进程已经一去不复返了。
我在网上搜索了很多关于vs await async,但是在这个特定的使用场景中,我并不真正理解其中的区别。我相信情况很简单。 vs. 其中,是一个异步方法,其中包含一些异步调用,例如使用wait调用db。 问题: 在这种情况下,两者之间有什么区别吗?任何帮助或意见,谢谢!
问题内容: 最近,我将计算机更新为功能更强大的计算机,并配备了四核超线程处理器(i7),因此可以使用大量实际并发。现在,我退出()正在开发的应用程序(带有Swing GUI)时, 偶尔会 遇到以下错误: 好吧,鉴于它开始使用具有更多并发能力的硬件发生,并且与线程有关,并且偶尔发生,这显然是某种时机。但是问题是堆栈跟踪太短了。我只有上面的清单。它根本不包含我自己的代码,因此很难猜测该错误在哪里。 有