ホームページ  >  記事  >  Java  >  Thread.sleep() が Swing UI をフリーズさせるのはなぜですか?

Thread.sleep() が Swing UI をフリーズさせるのはなぜですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-02 14:44:03377ブラウズ

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

Swing UI に対する Java の Thread.sleep() の影響

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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。