从按钮单击事件启动Thread时,Gui被阻止

时间:2014-10-20 23:39:54

标签: java multithreading swing runnable

这可能是一个基本问题,但我坚持使用。

我想了解一下当我从按钮点击事件启动新线程(runnable)时GUI被阻止的原因?我该如何克服这个问题?我做错了什么?

下面的代码在单击时会启动一个新线程,但是我想在单击该按钮时更改文本框的背景颜色但是我无法做到这一点,主要的ui也没有响应,而该线程是运行,我相信我正在通过启动一个新线程正确实现它,以便不阻止主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无响应?

2 个答案:

答案 0 :(得分:3)

while(thread.isAlive()){是一种阻塞方法,它会停止事件调度线程,直到Thread.isAlive变为false,这会阻止它处理添加到事件队列中的新事件,包括绘制请求

这是因为Swing是一个单线程环境,这意味着有一个线程负责处理进入程序的所有事件。这由Event Dispatching Thread处理。

所有用户生成的事件都在EDT中管理(即,actionPerformed方法,在EDT的上下文中调用)

Concurrency in Swing

您可以向NtmThread提供回电功能,或考虑使用SwingWorker并将PropertyChanegListener附加到state的监视器上并检查SwingWorker的状态已更改为DONE

有关详细信息,请参阅Worker Threads and SwingWorker

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

答案 1 :(得分:0)

您已经创建了一个新线程,但是您正在使用当前线程来检查创建的线程是否处于活动状态while(thread.isAlive()){。 所以当前的线程永远不会出现在循环中,直到你创建的线程没有停止 而你当前的线程负责完成所有的gui工作,但是你让它卡住了,这就是你的GUI被阻止的原因。