进度条用于长挥发事件调度程序线程作业

时间:2016-04-22 17:42:21

标签: java multithreading swing

我有一个长期运行的任务(打印整个摆动框架9999+次)。不幸的是,它只在事件派发线程中运行良好。所以我需要阻止gui。我想至少向用户显示进度。我的第一次天真尝试不起作用:

var array = [NSDate]()
array.sort { $0 < $1 }

这有什么不对?没有任何事情发生。

UPD : 这是一个示例,它说明了问题:

// this allo happens IN event dispatch thread
for (int i = 0; i < 9999; i++) {
    doLongEDTJob(i);
    myProgressBar.setValue(myProgressBar.getValue() + 1);
    myProgressBar.repaint();
}

1 个答案:

答案 0 :(得分:1)

  

不幸的是它只在事件派发线程中运行良好。所以我需要阻止gui。我想至少向用户显示进度。

您的要求存在冲突 - 如果您使用长时间运行的进程阻止事件线程,这将阻止事件线程进行绘制,从而阻止更新GUI - 因此您拥有XY Problem当解决方案完全使用不同的方法时,你问如何解决“X”。

问题的真正解决方案是弄清楚为什么你无法从EDT运行长时间运行的任务然后更改任务以便它能够很好地运行关闭 Swing事件线程,然后一旦完成,在事件线程上设置JProgressBar的值,通常最好使用SwingWorker完成。有关如何执行此操作的更详细答案,您需要显示和发布更多内容,最好是Minimal, Complete, and Verifiable example