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