Thread.join冻结进度条

时间:2011-11-15 23:16:40

标签: java multithreading swing

我有一个代码,它使用一个线程来运行多个进度条。

Thread thread1 = new Thread(progressbar1);
thread1.start(); 
thread2.start()

等等。我有

之后
thread1.join(); 
thread2.join(); 
thread3.join();

但是冻结所有三个进度条动画并仅在所有线程完成时显示完成。 如何解决这个问题呢? 感谢。

2 个答案:

答案 0 :(得分:3)

Event Dispatch Thread执行任何阻止操作都会导致GUI无响应并停止重新绘制。这就是为什么长时间运行的操作应该在后台线程中完成的原因。

看起来你知道你需要在后台线程中做事但仍想阻止EDT。你不应该这样做。相反,您需要一个回调 - 一些代码将在后台线程运行完毕后运行。

Java 6+中提供的已提供的回调机制是SwingWorker。实现一个worker,将join() s(和start() s)置于doInBackground()方法中。然后,您想要执行的任何Swing操作都可以进入done()

答案 1 :(得分:1)

您正在阻止UI线程。你不应该这样做。选项:

  • 另一个线程在前三个上调用join。在创造另一种资源方面浪费,但相当简单。
  • 使用计数器 - 确保使用AtomicInteger之类的内容,以确保不会遇到内存模型和竞争条件问题。在3处启动计数器,并在每个线程结束时递减计数器当最后一个线程完成其工作时(即其递减计数器将计数器置于0),使 it 回调到UI。

(第二个子弹可能就是你已经在做的......鉴于“我使用了一个计数器”的描述,很难确定。)

虽然我完全看到你在应用程序的控制流方面来自于事件驱动的世界更加困难,但这就是Swing的工作方式(并且它也是大多数其他UI框架的工作方式) 。您只是无法阻止UI线程。 (这也是C#5在语言级别上更容易实现的原因...)