我知道这个问题是由主线程中的睡眠或等待调用引起的,并且如何解决这个问题的答案是将该方法放入单独的线程,然后使该线程睡眠。但是代码很混乱,没有时间把它整理出来并分解成单独的线程,并想知道是否有其他方法来做这件事?即使它不是使用GUI的最干净或最常见的做法。我只需要从该方法暂停几秒钟。Java GUI,需要暂停一个不冻结GUI的方法
回答
如果不创建单独的线程,则无法执行此操作。用Java创建线程很简单。唯一需要注意的是你只能通过主线程触摸UI。出于这个原因,你需要使用类似SwingUtilities.invokeLater()。
无法在事件线程上睡眠,也不会导致GUI冻结。但是在Swing中,事件线程是在幕后创建和管理的 - 您的主线程(源自main()
方法的一个线程)是而不是事件线程。
因此,你可以安全地睡在你的主线程上。
为代码使用单独的线程是您唯一的解决方案。如果以其他方式阻止GUI,则Swing线程启动的每个操作都必须委派给单独的线程。
何处将声明此线程。请记住,任何对包含线程睡眠的函数的引用都会导致主线程暂停。因为主线程将不得不等待子线程暂停。
现实情况是,线程并不真正作为单独的独立线程工作,因为线程必须从另一个线程启动。换句话说,如果您正在创建桌面应用程序,并且即使您不使用其他线程,您的应用程序也是单线程应用程序。现在,如果您开始使用线程&使其进入睡眠状态,您很快就会发现,您将无法在应用程序中执行其他任何操作。没有&没有其他线程甚至不会运行,因为他们正在等待第一个线程完成睡眠。为什么是这样?因为线程是主线程的子线程,并且它是等待该睡眠子线程唤醒的主线程。由于java是单主线程应用程序,因此无法设计无线应用程序。任何,是的,你的应用程序中进一步定义的线程总是在主线程中运行。
除非有人能证明我错了,否则显然不会暂停主线程,因为这会锁定您的应用程序。然而,只要你定义了另一个线程并用sleep()
挂起它,这也会锁定你的应用程序,因为线程是在主应用程序的子类中定义的,因此也是主线程。
因此,为了让一个非常长的故事睡觉,暂停用户定义的线程,几乎完全相同,如果您的应用程序中的任何位置调用了Thread.sleep()
,则它会暂停整个应用程序。
这是不正确的。如果现有线程正在等待某些内容(例如锁定可用)并且新线程阻止了该线程的发生(例如,通过保持该锁定进行睡眠),则在新线程中休眠将只暂停现有线程。两者之间必须有一定的依赖关系,以阻止另一方,尽管有很多间接的方法可以发生。 – 2011-08-26 23:59:25
我为java编写了一个超级简单的延迟函数,它不会让GUI冻结。它每次都使用它,我想它也适用于你。
void Delay(Long ms){
Long dietime = System.currentTimeMillis()+ms;
while(System.currentTimeMillis()<dietime){
//do nothing
}
}
对于例如:要延迟5个millisecods线程使用Delay(5L)
这不会导致性能瓶颈吗?我的意思是性能受到影响可能会导致GUI看起来像冻结。我想我已经测试过这种方法(用其他语言),并不是那么好。虽然我不确定,但如果有效,这是一个很好的解决方案,我现在要测试 – 2013-12-25 16:22:15
我不知道,我在android平台上测试过它,但没有成功。也许它适用于JVM – 2013-12-25 16:25:04
这段代码和'Thread.sleep'没有区别,即它会停止当前的线程执行。所以,在GUI线程上执行会导致GUI冻结。 – 2014-07-17 10:16:20
- 1. scypy.signal.decimate()冻结GUI
- 2. Tkinter GUI冻结
- 3. QProcess冻结GUI
- 4. urllib2冻结GUI
- 5. BackgroundWorker上的方法冻结GUI
- 6. GUI冻结 - Perl Tk
- 7. WatchService冻结JavaFX GUI
- 8. 任务冻结GUI
- 9. Java javax.swing.Timer - 冻结我的GUI。解?
- 10. JFrame的GUI冻结+幻影
- 11. Backgroundworker冻结我的GUI
- 12. Java GUI,需要使用actionlistener?
- 13. Powershell GUI和循环暂停
- 14. Tkinter MessageBox'暂停'主GUI
- 15. Python PyQt4 progressbar冻结GUI
- 16. ThreadPool导致GUI冻结(?)
- 17. 如何从一个gui到另一个gui的java gui转换
- 18. 等待事件。如何不冻结gui
- 19. 使用scintilla NET停止在backgroundworker线程中不冻结GUI
- 20. JavaFX线程问题 - 在方法调用运行时GUI冻结
- 21. PyQt5 GUI需要的结构建议
- 22. 需要关于java的帮助GUI
- 23. 需要帮助,Eclipse中的Java GUI
- 24. Java GUI方法错误
- 25. GUI冻结,而我更新我的ObservableCollection
- 26. Thread.sleep()冻结包含GraphStream的JFrame/GUI图
- 27. 多线程及的Thread.Sleep冻结GUI
- 28. 处理程序冻结GUI的Android
- 29. Libgdx屏幕gui(用于暂停按钮)
- 30. 如何检测主线程在GUI中冻结GUI?
或者,如果他需要走另一条路,他可以使用javax.swing.SwingWorker为关闭移动方法事件调度线程(EDT)。 – ILMTitan 2010-04-19 20:52:06
链接已损坏。 – HewwoCraziness 2016-12-09 22:13:11