我知道这个问题是由主线程上的sleep或wait调用引起的,关于如何解决这个问题的答案是将该方法放入一个单独的线程然后让该线程休眠。但代码是一团糟,并没有真正的时间来解决它并将其拆分为单独的线程,并想知道是否有任何其他方式这样做?即使它不是使用GUI的最干净或最常见的做法。我只需要从方法中暂停几秒钟。
答案 0 :(得分:8)
如果不创建单独的线程,则无法执行此操作。用Java创建线程很容易。唯一需要注意的是,您只能通过主线程触摸UI。因此,您需要使用类似SwingUtilities.invokeLater()的内容。
答案 1 :(得分:1)
无法在事件线程上休眠,也不会导致GUI冻结。但是在Swing中,事件线程是在幕后创建和管理的 - 您的主线程(源自main()
方法的线程)是而不是事件线程。
所以,你可以安全地睡在主线上。
答案 2 :(得分:0)
使用单独的代码线程是您唯一的解决方案。必须将Swing线程启动的每个操作委托给一个单独的线程,否则会阻止GUI。
答案 3 :(得分:0)
我为java编写了一个超级简单的延迟函数,它不会让你的GUI冻结。每次我使用它都有效,我想它也适合你。
void Delay(Long ms){
Long dietime = System.currentTimeMillis()+ms;
while(System.currentTimeMillis()<dietime){
//do nothing
}
}
例如:要将线程延迟5毫秒,请使用延迟(5L)
答案 4 :(得分:-6)
在哪里宣布这个帖子。请记住,任何对包含线程休眠的函数的引用都会导致主线程暂停。因为主线程必须等待子线程暂停。
实际情况是,线程不会真正作为单独的独立线程工作,因为线程必须从另一个线程启动。换句话说,如果您正在创建桌面应用程序,即使您不使用其他线程,您的应用程序也是一个单线程应用程序。现在,如果你开始使用线程&amp;让他们入睡,你很快就会发现你将无法在应用程序中做任何其他事情。不和&amp;没有其他线程甚至不会运行,因为他们正在等待第一个线程完成睡眠。为什么是这样?导致该线程是主线程的子线程,它是等待该睡眠子线程唤醒的主线程。您无法设计无线应用程序,因为java是单主线程应用程序。在您的应用程序中进一步定义的任何,是的任何线程总是在主线程中运行。
除非有人能证明我错了,否则你显然永远不会暂停你的主线程,因为这会锁定你的应用程序。但是,一旦你定义了另一个线程并用sleep()
暂停它,这也会锁定你的应用程序,因为线程是在主应用程序的子类中定义的,因此是主线程。
因此,将一个非常长的故事放在床上,暂停用户定义的线程,几乎与您在应用中的任何位置调用Thread.sleep()
几乎完全一样,它
暂停整个应用程序。