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

Linda Hamilton
リリース: 2024-11-02 14:44:03
オリジナル
304 人が閲覧しました

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!