这可能是一个基本问题,但我一直困惑不已。
我想更多地了解为什么当我从按钮单击事件启动新线程(可运行)时 GUI 被阻止?我该如何克服这个问题?我做错了什么?
下面的代码在单击时启动一个新线程,但是我想在单击该按钮时更改文本框的背景颜色,但我无法做到这一点,而且主用户界面在该线程运行时没有响应,我相信我通过启动一个新线程正确地实现了它,以免阻塞主用户界面,但我一定错过了一些东西,因为这显然不是期望的行为。
代码:
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");
}
如何阻止我的用户界面在运行线程时变得无响应?
最佳答案
while(thread.isAlive()){
是一个阻塞方法,它将停止事件调度线程,直到 Thread.isAlive
变为 false,这会阻止它处理添加到事件队列中的新事件,包括绘制请求
发生这种情况是因为 Swing 是单线程环境,这意味着有一个线程负责处理进入程序的所有事件。这是由事件调度线程处理的。
所有用户生成的事件都在 EDT 内管理(即,在 EDT 的上下文中调用 actionPerformed
方法)
然后,您可以向 NtmThread
提供回调功能,或者考虑使用 SwingWorker
并将 PropertyChanegListener
附加到它作为属性 state
的监视器,并检查 SwingWorker
的状态是否已更改为 DONE
参见Worker Threads and SwingWorker了解更多详情
关于java - 从按钮单击事件启动线程时 Gui 被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44761610/