イベントディスパッチスレッドで `sleep()` を呼び出すと GUI がフリーズするのはなぜですか?

Patricia Arquette
リリース: 2024-11-03 13:39:03
オリジナル
428 人が閲覧しました

Why Does Calling `sleep()` on the Event Dispatch Thread Freeze the GUI?

単一スレッドでの sleep() の使用

Java では、スレッドの同期を処理するために wait() と sleep() が使用されます。ただし、他のスレッドを実行しているときに単一のスレッドで sleep() を利用しようとすると、問題が発生する可能性があります。

問題:

1 つのスレッドで sleep() を呼び出すときの場合、両方のスレッドが指定された期間実行を一時停止しているように見えます。この動作はなぜ発生しますか?

答え:

Swing GUI を使用する場合、メイン スレッドや他のスレッドとは異なる固有のスレッドがその作成を担当します。このスレッドはイベント ディスパッチ スレッド (EDT) として知られています。 EDT で sleep() が呼び出された場合、呼び出しが完了するまで実行が停止します。

GUI イベント処理が EDT で発生するため、このスレッドでのスリープ操作はイベント処理を一時停止し、スリープまで UI がフリーズしたように見えます。

解決策:

EDT または sleep() が意図しない実行ブロックを引き起こすスレッドで Thread.sleep() を使用するのは避けてください。あるいは、次のオプションを検討してください。

  • Swing Timer: EDT でのアクションの遅延を許可します。
  • Swing Worker:別のスレッドでタスクを非同期に実行するための便利なメカニズム。
  • TimerTask: 特定の間隔で実行するタスクをスケジュールするために、java.util.Timer とともに使用されます。
  • スレッド: オプションで、別のスレッドを作成し、そこで Thread.sleep() を呼び出すこともできますが、これは一般的に推奨されません。

注:

Java 1.6 以降の場合、Swing Timer と Swing Worker は、EDT でのアクションを遅延させるための推奨オプションです。以前の Java バージョンでは、TimerTask または Thread を SwingUtilities/EventQueue#invokeXX ブロックと組み合わせて使用​​して、UI の応答性を確保できます。

以上がイベントディスパッチスレッドで `sleep()` を呼び出すと GUI がフリーズするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート