首頁  >  文章  >  Java  >  為什麼 Thread.sleep() 會凍結我的 Swing UI?

為什麼 Thread.sleep() 會凍結我的 Swing UI?

Linda Hamilton
Linda Hamilton原創
2024-11-02 14:44:03376瀏覽

Why Does Thread.sleep() Freeze My Swing UI?

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中文網其他相關文章!

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