当 Java 中有 Thread.sleep 时,计时器不会停止

Posted

技术标签:

【中文标题】当 Java 中有 Thread.sleep 时,计时器不会停止【英文标题】:Timer won't stop when there is a Thread.sleep inside Java 【发布时间】:2016-02-03 05:49:10 【问题描述】:

你好,我有这段代码可以用 javafx 显示图像

public  void CantaCarta() throws InterruptedException 
            startGame.setDisable(true);
                Timer timer = new Timer();
            timer.scheduleAtFixedRate(new TimerTask() 
                @Override
                public void run() 
                    SwingUtilities.invokeLater(() -> 
                        for (int x=1; x<55;x++)

                            Image image = new Image(getClass().getResource("imgs/"+JuegoLoto.Muestra(x-1)+".jpg").toString(), true);
                            cantada.setImage(image);
                            if (x >= 54) 
                                System.out.print("Termina");
                                timer.cancel();
                              else 
                                System.out.print(" "+x+" ");

                                try 
                                    Thread.sleep(200);
                                 catch (InterruptedException ex) 
                                
                            


                        
                    );
                
            , 0, 1000);

     

图像会正确显示,但是当图像编号 54 在屏幕上时,它会循环回到 1,这都是因为

 Thread.sleep(200);

我该如何解决这个问题?我想延迟图像之间的时间

【问题讨论】:

先看看Concurrency in Swing和How to use Swing Timers 本质上,您正在使用循环和Thread.sleep 阻塞事件调度线程,这会阻止它更新屏幕。使用 Swing Timer(延迟 200 毫秒)或 SwingWorker ***.com/questions/16799015/…的可能重复 你弄清楚你在这里实际做什么了吗?您正在以固定速率安排任务,其中有一个循环,当 iit 完成时取消任务。所以这个任务实际上只运行一次。那么为什么是定时器呢?我建议您应该让计时器进行迭代。 【参考方案1】:

这开始说不通了。

您正在安排一个计时器任务每 1000 毫秒运行一次。 该任务有 54 次内部迭代,每次都显示图像,并且在所有情况下都显示图像,除了最后一次休眠 200 毫秒。 到目前为止的总时间 10600 毫秒加上显示图像所需的时间 计时器将在 1000 毫秒后重新安排任务:同时 任务将取消最后一次迭代的计时器。

所以你会得到:

53 张图像和 53 200 毫秒睡眠 大约 10% 完成后重新启动任务 第 54 张图片 定时器被取消。

所以你得到了大约十到十一次任务迭代,大部分是并行的。

我建议你:

200 毫秒 的时间间隔安排任务,让它在每次调用时显示下一个连续图像,环绕到开头或取消计时器或任何你想要的时间到最后一张图片,然后

摆脱内部循环。

【讨论】:

以上是关于当 Java 中有 Thread.sleep 时,计时器不会停止的主要内容,如果未能解决你的问题,请参考以下文章

java中用了thread.sleep()这个函数以后,当线程再被唤醒时,是重新执行thread.run()吗?

Thread.sleep() 和 GUI

java thread.sleep 也让 swing ui 进入睡眠状态

java thread.sleep 也让 swing ui 进入睡眠状态

Thread.sleep() 在 while 循环中

Objective-C/Cocoa 中 Java 的 Thread.sleep() 等价物是啥?