可以说我有一个像这样运行的线程:
private boolean working = true;
@Override public void run() {
working = true;
// do something
working = false;
....
}
Run Code Online (Sandbox Code Playgroud)
在我的主线程中,我不断推出与之合作的状态
while(threadClassObject.isWorking()) {
System.out.println(threadClassObject.isWorking());
}
Run Code Online (Sandbox Code Playgroud)
这会有用吗?我试过这个例子,它似乎工作.但有没有办法可以崩溃?如果线程正在改变工作的过程中,例如在mainThread尝试读取它的同时发生了什么?
我目前有一个班级列表,每个班级都会启动一个调度程序,如下所示:
private ScheduledFuture<?> myTask;
private ScheduledExecutorService scheduler;
public startScheduler() {
scheduler = Executors.newScheduledThreadPool( 1 );
myTask = scheduler.scheduleAtFixedRate(new Runnable() {
// doing work here
},
delay,
interval,
TimeUnit.MILLISECONDS );
}
Run Code Online (Sandbox Code Playgroud)
因此,每个类基本上都启动它自己的调度程序,并且只有一个任务。但是据我了解,调度程序可以并行执行并运行更多任务。这些任务(或在我当前的程序中,调度程序)具有不同的延迟和间隔值,并且启动的调度程序的数量对于我来说是未知的(因为用户可以启动新的调度程序并停止运行它们)。所有调度程序并行运行。那么我应该更改我的代码以仅使用一个调度程序吗?我应该选择“ CachedThreadPool”吗?
我有一个 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");
}
});
}
Run Code Online (Sandbox Code Playgroud)
它运行良好。我遇到的问题是,当我关闭应用程序时,我会不时收到空指针异常并出现此错误:
平台关闭后发现作业仍在运行。作业应由在关闭期间安排作业的插件取消:>org.eclipse.ui.internal.progress.TaskBarProgressManager$2
问题在于,作业由于异步执行而正在运行,但同时由于应用程序的关闭,所有内容都被破坏了。那么有没有办法获取/等待正在运行的 UI 作业,以便我可以确保作业在应用程序关闭之前完成?