首頁 >Java >java教程 >為什麼在事件調度執行緒上呼叫 `sleep()` 會凍結 GUI?

為什麼在事件調度執行緒上呼叫 `sleep()` 會凍結 GUI?

Patricia Arquette
Patricia Arquette原創
2024-11-03 13:39:03501瀏覽

Why Does Calling `sleep()` on the Event Dispatch Thread Freeze the GUI?

在單執行緒中使用 sleep()

在 Java 中,wait() 和 sleep() 來處理執行緒同步。但是,當在運行其他執行緒時嘗試在單一執行緒上使用 sleep() 時,可能會出現問題。

問題:

在一個執行緒上呼叫 sleep() 時,兩個執行緒似乎都暫停執行指定的持續時間。為什麼會發生這種行為?

答案:

使用 Swing GUI 時,一個不同於主執行緒和其他執行緒的唯一執行緒負責其建立。該執行緒稱為事件調度執行緒 (EDT)。如果在 EDT 上呼叫 sleep(),它將暫停執行,直到呼叫完成。

由於 GUI 事件處理發生在 EDT 上,因此該執行緒上的任何睡眠操作都會暫停事件處理,導致 UI 看起來凍結直到睡眠() 結論。

解:

避免使用 Thread.sleep()在 EDT 或 sleep() 會導致意外執行阻塞的執行緒上。或者,考慮以下選項:

  • Swing 計時器: 允許延遲 EDT 上的操作。
  • Swing Worker: 提供在單獨的系統上非同步執行任務的便利機制執行緒。
  • TimerTask: 與 java.util.Timer 一起使用來安排任務以特定時間間隔運行。
  • 線程: 您可以選擇可以創建一個單獨的線程並在其上調用 Thread.sleep(),儘管這通常不是推薦。

注意:

對於 Java 1.6 或更高版本,Swing Timer 和 Swing Worker 是在 EDT 上延遲操作的首選選項。對於早期的 Java 版本,TimerTask 或 Thread 可以與 SwingUtilities/EventQueue#invokeXX 區塊結合使用,以確保 UI 回應能力。

以上是為什麼在事件調度執行緒上呼叫 `sleep()` 會凍結 GUI?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn