- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这可能是一个基本问题,但却是我一直坚持的问题。
我想更多地了解为什么当我从按钮单击事件启动新线程(可运行)时 GUI 被阻塞?我该如何克服呢?我做错了什么?
下面的代码在单击时启动一个新线程,但是我想在单击该按钮时更改文本框的背景颜色但我无法做到这一点,而且主 ui 在该线程时没有响应运行时,我相信我通过启动一个新线程正确地实现了它,以免阻塞主用户界面,但我一定错过了一些东西,因为这显然不是我们想要的行为。
代码:
private void startButtonEvent(ActionEvent evt) {
ntmStatusText.setBackground(Color.green);// textbackground I want to change
//Start Ntm Thread
Thread thread = new Thread(new NtmThread());
thread.start();
while(thread.isAlive()){
System.out.println("thread still working");
}
System.out.println("thread stopped");
}
如何阻止我的 Ui 在运行线程时变得无响应?
最佳答案
while(thread.isAlive()){
是一个阻塞方法,它将停止事件调度线程,直到 Thread.isAlive
变为 false,这可以防止它被能够处理添加到事件队列的新事件,包括绘制请求
发生这种情况是因为 Swing 是单线程环境,这意味着只有一个线程负责处理进入程序的所有事件。这由事件调度线程处理。
所有用户生成的事件都在 EDT 中进行管理(也就是说,您的 actionPerformed
方法在 EDT 的上下文中被调用)
然后您要么为您的 NtmThread
提供回调功能,要么考虑使用 SwingWorker
并为其附加一个 PropertyChanegListener
作为监视器属性 state
并检查 SwingWorker
的状态是否已更改为 DONE
参见 Worker Threads and SwingWorker了解更多详情
关于java - Gui 在从按钮单击事件启动线程时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26476679/
我是一名优秀的程序员,十分优秀!