繁体   English   中英

Thread.join冻结进度条

[英]Thread.join freezes progressbar

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

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

等等。 我有了

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

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

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

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

SwingWorker提供了一个已经提供的Java 6+回调机制。 实现一个worker,将join() s(和start() s)放在doInBackground()方法中。 然后你想要做的任何Swing操作都可以进入done()

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

  • 另一个线程这只是调用join的前三。 在创建另一种资源方面浪费,但相当简单。
  • 使用计数器 - 确保使用类似AtomicInteger东西,以确保不会遇到内存模型和竞争条件问题。 在3开始计数,并在最后一个线程完成其工作(即其减量把计数器为0),在每个线程结束递减它, 让它回调到UI。

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

虽然我完全看到你在应用程序的控制流方面来自于事件驱动的世界更加困难,但这就是Swing的工作方式(这也是大多数其他UI框架的工作方式)。 你根本无法阻止UI线程。 (这也是为什么C#5在语言层面上变得更容易......)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM