在單執行緒中使用 sleep()
在 Java 中,wait() 和 sleep() 來處理執行緒同步。但是,當在運行其他執行緒時嘗試在單一執行緒上使用 sleep() 時,可能會出現問題。
問題:
在一個執行緒上呼叫 sleep() 時,兩個執行緒似乎都暫停執行指定的持續時間。為什麼會發生這種行為?
答案:
使用 Swing GUI 時,一個不同於主執行緒和其他執行緒的唯一執行緒負責其建立。該執行緒稱為事件調度執行緒 (EDT)。如果在 EDT 上呼叫 sleep(),它將暫停執行,直到呼叫完成。
由於 GUI 事件處理發生在 EDT 上,因此該執行緒上的任何睡眠操作都會暫停事件處理,導致 UI 看起來凍結直到睡眠() 結論。
解:
避免使用 Thread.sleep()在 EDT 或 sleep() 會導致意外執行阻塞的執行緒上。或者,考慮以下選項:
注意:
對於 Java 1.6 或更高版本,Swing Timer 和 Swing Worker 是在 EDT 上延遲操作的首選選項。對於早期的 Java 版本,TimerTask 或 Thread 可以與 SwingUtilities/EventQueue#invokeXX 區塊結合使用,以確保 UI 回應能力。
以上是為什麼在事件調度執行緒上呼叫 `sleep()` 會凍結 GUI?的詳細內容。更多資訊請關注PHP中文網其他相關文章!