SwingWorker同步方法队列阻塞还是什么?

时间:2011-11-29 18:14:26

标签: java swing concurrency blocking swingworker

理论问题。如果我有两个SwingWorkers和一个带方法

的outputObject
public void synchronized outputToPane(String output)

如果每个SwingWorker都有一个循环,如下所示:

//SwingWorker1
while(true) { 
     outputObject.outputToPane("garbage");
}
//SwingWorker2
Integer i=0;
while(true) {
     outputObject.outputToPane(i.toString());
     i++;
}

那些互动会怎样? outputToPane方法是从一个线程接收一个参数并阻塞另一个线程直到它与第一个线程完成,还是构建一个将按接收顺序执行的任务队列,还是其他一些选项?

我问的原因:
我有两个线程将进行一些重数字运算,一个使用不可重用的数据流,另一个使用文件。我希望他们在达到某些里程碑时输出到中央消息区;但是,我不能冒着数据流在等待另一个线程完成输出时被阻止的风险。那么我将面临丢失数据的风险。

2 个答案:

答案 0 :(得分:2)

synchronized仅保证相互排斥。不是公平的,这实际上意味着你的工人可能会很好地交替,或者第一个人可能获得优先权并完全阻止第二个工作,直到完成,或之间的任何事情。

有关公平性的更多信息,请参阅Reentrantlock文档。也许您可以考虑使用它而不是synchronized。可能更好的替代方案是使用Queue

答案 1 :(得分:0)

我建议您在消息区域中有两个输出对象。因为如果一个线程开始修改输出答案,那么另一个线程将不得不等待它完成。即使您可以对其进行优化以使其足够快,实际的信息显示也会使您的线程随着时间的推移逐渐减慢。

虽然您可能尝试同步它们,但结果可能并不总是100%安全