Java 从ModalContext线程通知WorkerPool
你好, 我正在尝试获取一个实现,该实现在每个ModalContext线程中等待UI操作完成后的所有作业,其中:Java 从ModalContext线程通知WorkerPool,java,multithreading,swt,Java,Multithreading,Swt,你好, 我正在尝试获取一个实现,该实现在每个ModalContext线程中等待UI操作完成后的所有作业,其中: 将创建计划作业的侦听器 在每个Display.syncExec的UI线程中调用UI操作 所有计划的作业都会等待,如果其中一个挂起的时间太长,则会被取消 以notifyAll()通知 通过在UI线程本身中调用一段代码并在它之后调用我的方法来工作,因此我将侦听器创建移到构造函数中,一切都很好,直到我们到达notifyAll()案例,该案例针对具有巨大延迟的调度工作(WorkerPool被放
protected void updateUI() {
Display display = getDisplay();
IRunnableWithProgress op = m -> {
//Paint
display.syncExec(() -> display.getActiveShell().layout(true, true));
waitUntilAllJobsHaveFinished2(display);
};
try {
ModalContext.run(op, true, new NullProgressMonitor(), display);
} catch (InvocationTargetException | InterruptedException e) {
Log.logException("", e); //$NON-NLS-1$
}
}
private void waitUntilAllJobsHaveFinished2(Display display) {
Instant start = Instant.now();
while (!scheduledJobs.isEmpty()) {
//Avoid infinite loop from some jobs.
if (Instant.now().minusSeconds(5).isAfter(start)) {
display.syncExec(() -> notifyAll());
System.out.println("---\nToSting: " + scheduledJobs + "\nSize: " + scheduledJobs.size());
start = Instant.now();
}
}
}
什么是
notifyAll()
?使用IJobManager.join
等待一系列作业完成。在较新版本的中还有JobGroup
Eclipse@greg-449我试图中断WorkerPool.sleep()中的wait(),否则它会毫无意义地等待一分钟。有点像是通过反复试验才做到的。将调查JobManager和JobGroup。工作经理似乎正是我需要的。非常感谢。工作经理负责管理员工库,并在需要时叫醒他们。@greg-449我很困惑。我尝试了Job.getJobManager().join()
,但它陷入了死锁/永远挂起<代码>作业管理器未挂起,作业的
状态为正在运行
。从JavaDoc forIJobManager.join()
关于死锁,假设它确实是由拥有一个等待的锁引起的,我想我确实需要某种形式的notify()/notifyAll()
,但在我尝试它的那一刻,我得到了IllegalMonitorStateException
。