JavaGUI,也需要暂停方法而不冻结GUI

JavaGUI,也需要暂停方法而不冻结GUI,java,user-interface,multithreading,freeze,Java,User Interface,Multithreading,Freeze,我知道这个问题是由主线程上的sleep或wait调用引起的,解决这个问题的方法是将该方法放入一个单独的线程中,然后使该线程休眠。但是代码太乱了,没有时间去整理它,把它分成不同的线程,我想知道是否还有其他方法可以做到这一点?即使这不是使用GUI的最干净或最常见的实践。我只需要从该方法暂停几秒钟。不可能在事件线程上休眠,也不会导致GUI冻结。但是,在Swing中,事件线程是在后台创建和管理的-您的主线程(源自main()method的主线程)不是事件线程 因此,您可以安全地在主线程上睡眠。如果不创建

我知道这个问题是由主线程上的sleep或wait调用引起的,解决这个问题的方法是将该方法放入一个单独的线程中,然后使该线程休眠。但是代码太乱了,没有时间去整理它,把它分成不同的线程,我想知道是否还有其他方法可以做到这一点?即使这不是使用GUI的最干净或最常见的实践。我只需要从该方法暂停几秒钟。

不可能在事件线程上休眠,也不会导致GUI冻结。但是,在Swing中,事件线程是在后台创建和管理的-您的主线程(源自
main()
method的主线程)不是事件线程


因此,您可以安全地在主线程上睡眠。

如果不创建单独的线程,就无法完成此操作。用Java创建线程很容易。唯一需要注意的是,您只能通过主线程触摸UI。出于这个原因,您需要使用类似的方法。

为代码使用单独的线程是您唯一的解决方案。如果Swing线程启动的每个操作会阻塞GUI,则必须将其委托给单独的线程。

在哪里声明此线程。请记住,对包含线程睡眠的函数的任何引用都会导致主线程暂停。因为主线程必须等待子线程暂停

事实上,线程并不是真正独立的线程,因为一个线程必须从另一个线程开始。换句话说,如果您正在创建桌面应用程序,即使您不使用其他线程,您的应用程序也是单线程应用程序。现在,如果您开始使用线程并将其置于睡眠状态,您将很快发现您将无法在应用程序中执行任何其他操作。否&No其他线程甚至不会运行,因为它们正在等待第一个线程完成睡眠。为什么会这样?因为线程是主线程的子线程,而正是主线程在等待睡眠子线程唤醒。您也不能设计无线程应用程序,因为java是单主线程应用程序。应用程序中进一步定义的Any、yes、Any线程始终在主线程中运行

除非有人能证明我错了,否则你显然永远不会暂停你的主线程,因为这会锁定你的应用程序。但是,一旦您定义了另一个线程并使用
sleep()
将其挂起,这也会锁定您的应用程序,因为该线程是在主应用程序的子类中定义的,因此也是主线程

因此,将一个非常长的故事放到床上,暂停一个用户定义的线程,这几乎与您在应用程序中的任何位置调用
thread.sleep()
几乎完全相同
暂停整个应用程序

我为java编写了一个超级简单的延迟函数,它不会让您的GUI冻结。每次我使用它,它都会起作用,我想它也会对你起作用

     void Delay(Long ms){

       Long dietime = System.currentTimeMillis()+ms;
       while(System.currentTimeMillis()<dietime){
           //do nothing
       }
   }
无效延迟(长毫秒){
Long dietime=System.currentTimeMillis()+ms;

while(System.currentTimeMillis(),或者,如果他需要换一种方式,他可以使用javax.swing.SwingWorker将该方法从事件调度线程(EDT)中移出。链接已断开。这是不正确的。如果现有线程正在等待某个东西(例如,等待可用的锁),则在新线程中睡眠只会暂停现有线程新线程正在防止这种情况发生(例如,在持有锁的同时睡觉)。两者之间一定存在某种依赖关系,一个会使另一个停滞,尽管有很多间接的方式。这不会导致性能瓶颈吗?我的意思是性能问题可能会导致GUI看起来冻结。我想我已经测试过这种方法(用其他语言)虽然我不确定它是否有效,这是一个很好的解决方案,但我现在要测试我不知道,我在android平台上测试了它,但它不起作用。也许它在JVM上有效。这段代码与
线程没有什么不同。sleep
即它会停止当前线程的执行。因此,在GUI线程上执行会导致GUI冻结。