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