加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 对单个线程使用sleep()

发布时间:2020-12-15 05:20:48 所属栏目:Java 来源:网络整理
导读:我对 java很新,并开始使用不同的线程,以便在我的代码的一部分上使用wait()或sleep()并让其他线程仍然运行. 对于这个项目,我使用JFrame与javax.swing.*和java.awt.*导入.我想要做的是让其中一个线程(在我的代码中它是主要的,起始线程)允许玩家在tic tac toe b
我对 java很新,并开始使用不同的线程,以便在我的代码的一部分上使用wait()或sleep()并让其他线程仍然运行.

对于这个项目,我使用JFrame与javax.swing.*和java.awt.*导入.我想要做的是让其中一个线程(在我的代码中它是主要的,起始线程)允许玩家在tic tac toe board上选择一个空间,当他们点击它时,它将改变图标,并且然后AI将等待1秒钟,然后从我创建的第二个线程回放.

不幸的是,每当我调用ait.sleep(1000)(ait是我的线程名称)时,两个线程都会在完成执行之前等待1秒.谁能告诉我为什么睡一个线程会阻止我的整个执行?

解决方法

Can anyone tell me why sleeping one thread is stopping my whole
execution

为了更好地解释你的Swing GUI是在它自己的特殊线程上创建的,该线程与main()和其他代码将运行的线程分开,这是通过在SwingUtilities.invokeXXX块中创建Swing组件来完成的(即使你没有这样做你的GUI将在名为initial thread的单个线程上运行.现在,如果您只是在Event Dispatch Thread上调用sleep(或者在同一个Thread上),它将等待对Thread.sleep的调用完成.现在因为在EDT上处理所有Swing事件,我们通过调用sleep(..)来暂停执行,从而暂停处理UI事件,因此GUI被冻结(直到sleep(..)返回).

你不应该在Event Dispatch Thread上使用Thread.sleep(..)(或者睡眠会阻止不必要的执行阻塞的任何线程),因为这会导致UI看起来被冻结.

Here是一个很好的例子,它准确地说明了在GUI的EDT上调用Thread.sleep(..)引起的这种不必要的行为.

而是使用:

> Swing Timer例如:

int delay=1000;// wait for second

Timer timer = new Timer(delay,new AbstractAction() {
    @Override
    public void actionPerformed(ActionEvent ae) {
        //action that you want performed 
    }
});
//timer.setRepeats(false);//the timer should only go off once
timer.start();

> Swing Worker

或者如果没有创建/修改Swing组件:

> TimerTask
> Thread,然后你会使用Thread.sleep(int milis)(但无论如何都是IMO的最后一个选项)

UPDATE

Swing Timer / SwingWorker只是在Java 1.6中添加了,但是,TimerTask和Thread已经存在了很长的正弦Java 1.3和JDK 1,因此您甚至可以使用上述两种方法中的任何一种并包装创建/操作Swing组件的调用在SwingUtilities / EventQueue#invokeXX块中;这就是以往的方式:P

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读