スレッド環境で単一スレッドに 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 サイトの他の関連記事を参照してください。