在线程环境中对单线程使用 sleep()
使用多个线程时,避免暂停执行至关重要当只有一个线程需要等待时,所有线程的数量。不幸的是,在一个线程上调用 Thread.sleep() 也可能会无意中影响其他线程的执行。
在这种情况下,代码片段利用了 javax.swing.* 和 java.awt.* 中的 JFrame包。主线程处理井字游戏板的用户输入,而辅助线程则负责人工智能的响应。为了在 AI 轮到之前实现延迟,代码尝试使用 ait.sleep(1000)。然而,两个线程都意外暂停了 1 秒。
这种行为的原因在于 Swing GUI 是在与主线程分离的自己的线程上创建的。当在事件调度线程 (EDT) 上调用 Thread.sleep() 时,它会导致所有 Swing 事件的处理暂停,包括用户交互和 GUI 更新所需的事件。结果,整个 GUI 看起来冻结,直到 sleep() 调用完成。
解决方案
为了避免暂停整个执行,必须使用替代方法推迟美国东部夏令时间。考虑以下选项:
<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 组件,可以创建一个单独的线程,并在其上使用 Thread.sleep()该线程不会影响其他线程或 GUI。
以上是为什么在单个线程上调用 Thread.sleep() 会冻结整个 Swing GUI?的详细内容。更多信息请关注PHP中文网其他相关文章!