ホームページ > Java > &#&チュートリアル > 単一スレッドで Thread.sleep() を呼び出すと、Swing GUI 全体がフリーズするのはなぜですか?

単一スレッドで Thread.sleep() を呼び出すと、Swing GUI 全体がフリーズするのはなぜですか?

DDD
リリース: 2024-11-05 00:00:03
オリジナル
240 人が閲覧しました

Why Does Calling Thread.sleep() on a Single Thread Freeze the Entire Swing GUI?

スレッド環境で単一スレッドに sleep() を使用する

複数のスレッドを使用する場合、実行の一時停止を避けることが重要です単一のスレッドだけを待機する必要がある場合、すべてのスレッドの待機が必要になります。残念ながら、スレッド上で Thread.sleep() を呼び出すと、他のスレッドの実行にも誤って影響を与える可能性があります。

この場合、コード スニペットは javax.swing.* および java.awt.* の JFrame を利用します。パッケージ。メイン スレッドは三目並べボードに対するユーザー入力を処理し、セカンダリ スレッドは AI の応答を担当します。 AI の順番の前に遅延を実装するために、コードは ait.sleep(1000) の使用を試みます。ただし、両方のスレッドが予期せず 1 秒間一時停止します。

この動作の理由は、Swing GUI がメイン スレッドとは別の独自のスレッドで作成されるという事実にあります。 Thread.sleep() がイベント ディスパッチ スレッド (EDT) で呼び出されると、ユーザー操作や GUI の更新に必要なイベントを含む、すべての Swing イベントの処理が一時停止されます。その結果、sleep() 呼び出しが完了するまで GUI 全体がフリーズしたように見えます。

解決策

実行全体の一時停止を回避するには、代替メソッドを使用することが不可欠です。 EDT に遅延を実装するため。次のオプションを検討してください:

  • スイング タイマー:
<code class="java">int delay = 1000;

Timer timer = new Timer(delay, new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        // Action to be performed after the delay
    }
});

timer.start();</code>
ログイン後にコピー
  • スイング ワーカー:
  • 他のスレッドを使用します (そうではありません)推奨):

Swing コンポーネントを操作する必要がない場合は、別のスレッドを作成し、他のスレッドや GUI に影響を与えることなく、そのスレッド上で Thread.sleep() を使用できます。

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

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