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

Java 从按钮单击事件启动线程时Gui被阻止,java,multithreading,swing,runnable,Java,Multithreading,Swing,Runnable,这可能是一个基本的问题,但我一直坚持这个问题 我想了解一下,当我从一个按钮点击事件启动一个新线程(runnable)时,为什么GUI会被阻塞?我如何克服这一点?我做错了什么 下面的代码在单击时启动一个新线程,但是我想在单击该按钮时更改文本框的背景色,但我无法做到这一点,而且该线程运行时主ui没有响应,我相信我通过启动一个新线程来正确地实现它,这样就不会阻塞主ui,但我肯定错过了一些东西,因为这显然不是期望的行为 代码: 如何防止Ui在运行线程时变得无响应?您已经创建了一个新线程,但正在使用当前线

这可能是一个基本的问题,但我一直坚持这个问题

我想了解一下,当我从一个按钮点击事件启动一个新线程(runnable)时,为什么GUI会被阻塞?我如何克服这一点?我做错了什么

下面的代码在单击时启动一个新线程,但是我想在单击该按钮时更改文本框的背景色,但我无法做到这一点,而且该线程运行时主ui没有响应,我相信我通过启动一个新线程来正确地实现它,这样就不会阻塞主ui,但我肯定错过了一些东西,因为这显然不是期望的行为

代码:


如何防止Ui在运行线程时变得无响应?

您已经创建了一个新线程,但正在使用当前线程检查创建的线程是否处于活动状态(thread.isAlive()){
因此,在您创建的线程未停止之前,当前线程永远无法退出循环。

您的当前线程负责执行所有gui工作,但您让它卡住了,这就是您的gui被阻止的原因。

您已经创建了一个新线程,但您正在使用当前线程检查创建的线程在(thread.isAlive()){
因此,在您创建的线程未停止之前,当前线程永远无法退出循环。
您的当前线程负责执行所有gui工作,但您使它卡住了,这就是为什么您的gui被阻止的原因。

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

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

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

您可以向您的<代码> NTMSTOR> <代码>提供回调功能,或者考虑使用<代码> SaveWorks并附加<代码> PropertyChanegListener <代码>为属性'<代码>状态>代码>的监视器,并检查<代码> SWIFWER Works/Cult> S状态已更改为<代码>完成/代码> < /P> 有关更多详细信息,请参阅

例如:

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

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

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

您可以向您的<代码> NTMSTOR> <代码>提供回调功能,或者考虑使用<代码> SaveWorks并附加<代码> PropertyChanegListener <代码>为属性'<代码>状态>代码>的监视器,并检查<代码> SWIFWER Works/Cult> S状态已更改为<代码>完成/代码> < /P> 有关更多详细信息,请参阅


例如:

'while(thread.isAlive()){'nono!不要在GUI事件处理程序中等待。不要循环,不要加入(),不要等待事件。不要!GUI处理程序线程是一个状态机。不要在其中等待。不要在任何标志上循环。不要在任何线程状态上循环。不要在GUI事件处理程序中等待。永远不要。好了,这就解释了,我永远永远不会再这样做了!谢谢你的帮助。:)好的,我可能有点醉了…@MartinJames Party!!没有pRabReon,这是一个证明你的知识能够回答,而有点醉了,我在另一方面应该考虑不要试图在早上0100点学习编程:“哈哈。”当(线程。ISALIVE()){NoNONO!不要在GUI事件处理程序中等待。不要循环,不要连接()。,不要等待事件。不要!GUI处理程序线程是一个状态机。不要在其中等待。不要在任何标志上循环。不要在任何线程状态上循环。不要在GUI事件处理程序中等待。永远不要。好了,这就解释了,我永远永远不会再这样做了!谢谢你的帮助。:)好的,我可能有点醉了…@MartinJames Party!!没有p罗姆林,这是一个证明你的知识可以回答,而有点醉了,我在另一方面应该考虑不要试图在早上0100点学习编程:哈哈,谢谢你在这样一个NoOB问题的出色回答,我的下一个问题是如何更新线程进展的UI,但你已经H了。谢谢!谢谢你对这样一个noob问题的出色回答,我的下一个问题是如何在线程进程中更新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");

    }