我知道這個問題是由主線程中的睡眠或等待調用引起的,並且如何解決這個問題的答案是將該方法放入單獨的線程,然後使該線程睡眠。但是代碼很混亂,沒有時間把它整理出來並分解成單獨的線程,並想知道是否有其他方法來做這件事?即使它不是使用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. 暫停Swing GUI
- 2. 的Java Swing GUI凍結
- 3. QProcess GUI不凍結
- 4. Android Java GUI凍結/ w ProgressBar
- 5. Powershell:凍結GUI
- 6. Tkinter GUI凍結
- 7. QProcess凍結GUI
- 8. scypy.signal.decimate()凍結GUI
- 9. FireDac凍結GUI
- 10. urllib2凍結GUI
- 11. BackgroundWorker上的方法凍結GUI
- 12. Android Handler凍結GUI
- 13. GUI凍結 - Perl Tk
- 14. 任務凍結GUI
- 15. GUI凍結和多
- 16. WatchService凍結JavaFX GUI
- 17. 的Java GUI凍結甚至SwingWorker的
- 18. 暫停GUI程序的Matlab
- 19. GUI凍結在While循環中的Java
- 20. Java javax.swing.Timer - 凍結我的GUI。解?
- 21. JFrame的GUI凍結+幻影
- 22. 在Java GUI中暫停執行
- 23. Backgroundworker凍結我的GUI
- 24. Java GUI,需要使用actionlistener?
- 25. Java Swing GUI重新聚焦時凍結
- 26. Java Swing GUI凍結 - 觀察者模式
- 27. Java LibGDX SwingWorker凍結GUI(塊上傳)
- 28. Tkinter MessageBox'暫停'主GUI
- 29. Powershell GUI和循環暫停
- 30. 不凍結的NHibernate數據訪問GUI
或者,如果他需要走另一條路,他可以使用javax.swing.SwingWorker爲關閉移動方法事件調度線程(EDT)。 – ILMTitan 2010-04-19 20:52:06
鏈接已損壞。 – HewwoCraziness 2016-12-09 22:13:11