Java 的Thread.sleep() 對Swing UI 的影響
在Java 中,在基於Swing 的應用程式中利用Thread. sleep()可能會產生意外後果,即暫停整個使用者介面,使其失去回應。
問題描述:
考慮以下程式碼片段:
<code class="java">// Code to create a simple Swing-based application if (option == JFileChooser.APPROVE_OPTION) { selectedDirectory = chooser.getSelectedFiles(); try { while (true) { runCheck(selectedDirectory); Thread.sleep(1000 * 5);//1000 is 1 second } } catch (InterruptedException e1) { Thread.currentThread().interrupt(); e1.printStackTrace(); } } </code>
應用程式在執行檢查之前使用Thread.sleep() 暫停5秒。然而,在此睡眠期間,使用者介面變得無響應並呈灰色。
UI 不活動的原因:
Thread.sleep() 暫停呼叫它的線程,在本例中為事件調度線程 (EDT)。 EDT 負責處理所有 GUI 事件並呈現使用者介面。因此,當 EDT 進入睡眠狀態時,UI 停止回應輸入並更新其顯示。
替代方法:
為了避免凍結 UI,適當的解決方案是使用 javax.swing.Timer。計時器可以安排任務在EDT 後按指定的時間間隔執行:
<code class="java">Timer t = new Timer(1000 * 5, new ActionListener() { public void actionPerformed(ActionEvent e) { // do your recurring task } });</code>
在這種情況下,執行檢查的任務計劃在EDT 後每5 秒運行一次,從而允許UI 保持不變在檢查運行時響應。
以上是為什麼 Thread.sleep() 會凍結我的 Swing UI?的詳細內容。更多資訊請關注PHP中文網其他相關文章!