java - 从按钮单击事件启动线程时 Gui 被阻止

标签 java multithreading swing runnable

这可能是一个基本问题,但我一直困惑不已。

我想更多地了解为什么当我从按钮单击事件启动新线程(可运行)时 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 方法)

Concurrency in Swing

然后,您可以向 NtmThread 提供回调功能,或者考虑使用 SwingWorker 并将 PropertyChanegListener 附加到它作为属性 state 的监视器,并检查 SwingWorker 的状态是否已更改为 DONE

参见Worker Threads and SwingWorker了解更多详情

例如:How to use jProgress bar for ProcessBuilder process?

关于java - 从按钮单击事件启动线程时 Gui 被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44761610/

相关文章:

python - 从 Popen 调用时处理来自 unix 命令的错误

python - 增加列表理解中多个 for 循环的时间

java - JInternalFrame装饰

java - 如何加快获取图像和文本的jdbc sql查询速度

java - 状态模式和封装

java - 如何处理时区来计算滞后

java - 带有json的Spring rest junit帖子

python - 使用 os.popen() 或子进程执行函数

java - JTree 节点的可变工具提示

java - Spring Autowiring 参数化类的问题