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

Timer won't stop when there is a Thread.sleep inside Java

你好,我有这段代码可以用 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);

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

这开始没有意义。

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

所以你会得到:

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

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

我建议你:

  • 200ms 间隔安排任务,让它在每次调用时显示下一张顺序图像,循环到开头或取消计时器或者当它到达最后一张图片时你想要的任何东西,

  • 去掉内部循环。