我在 Eclipse RCP 应用程序中运行大量并发作业时出现问题。当我启动100 Jobs (如下图所示)时,它们会正常执行,但在完成后,它们仍然可以在 Progress View 中显示约10秒钟。我希望进度视图在完成后立即清除作业。如果我少开始作业(例如10)进度视图立即刷新它。
class MyJob extends Job
{
public MyJob(String name) {
super(name);
}
public IStatus run(IProgressMonitor monitor){
//SOME EXPENSIVE COMPUTATIONS
BigInteger bigint = new BigInteger("0");
for ( int i=0 ; i<100 ; i++ ) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
bigint = bigint.add(new BigInteger(Integer.toString(i)));
}
monitor.done();
System.out.println(new Random().nextInt());
return new Status(IStatus.OK, "foo", "OK");
}
}
答案 0 :(得分:2)
每个作业都被安排为一个单独的线程,如果有很多锁定/同步/线程管理机制需要一些开销。 for example some internal Eclipse Jobs code明确将进度条反馈机制置于睡眠状态250ms。这样的解决方案可能会长期拖延。
无论如何在Progress View中有100个条目不是用户友好的。我建议将这些工作分组为Job.setProgressGroup()
。也许视图中的条目较少会掩盖响应速度慢的问题。
答案 1 :(得分:0)
在这种情况下,我会说分配自己的线程比使用Jobs更好。您的100个作业将开始使用将用于执行Workbench维护的作业线程。分配您自己的线程意味着作业线程池不会增长到最大值并保持不变。
我有一个Job启动你的Threads并将进度报告给Progress View。您可以使用SubMonitor将主IProgressMonitor拆分为100,这样您启动的每个Thread / Runnable对都可以将进度报告回主Job。