java – 对单个线程使用sleep()
我对
java很新,并开始使用不同的线程,以便在我的代码的一部分上使用wait()或sleep()并让其他线程仍然运行.
对于这个项目,我使用JFrame与javax.swing.*和java.awt.*导入.我想要做的是让其中一个线程(在我的代码中它是主要的,起始线程)允许玩家在tic tac toe board上选择一个空间,当他们点击它时,它将改变图标,并且然后AI将等待1秒钟,然后从我创建的第二个线程回放. 不幸的是,每当我调用ait.sleep(1000)(ait是我的线程名称)时,两个线程都会在完成执行之前等待1秒.谁能告诉我为什么睡一个线程会阻止我的整个执行? 解决方法
为了更好地解释你的Swing GUI是在它自己的特殊线程上创建的,该线程与main()和其他代码将运行的线程分开,这是通过在SwingUtilities.invokeXXX块中创建Swing组件来完成的(即使你没有这样做你的GUI将在名为initial thread的单个线程上运行.现在,如果您只是在Event Dispatch Thread上调用sleep(或者在同一个Thread上),它将等待对Thread.sleep的调用完成.现在因为在EDT上处理所有Swing事件,我们通过调用sleep(..)来暂停执行,从而暂停处理UI事件,因此GUI被冻结(直到sleep(..)返回). 你不应该在 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 UPDATE Swing Timer / SwingWorker只是在Java 1.6中添加了,但是,TimerTask和Thread已经存在了很长的正弦Java 1.3和JDK 1,因此您甚至可以使用上述两种方法中的任何一种并包装创建/操作Swing组件的调用在SwingUtilities / EventQueue#invokeXX块中;这就是以往的方式:P (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |