当Java内部存在Thread.sleep时,计时器不会停止

时间:2015-11-03 06:47:51

标签: java swing timer sleep

您好我有这个代码用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);

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

1 个答案:

答案 0 :(得分:1)

这并没有意义。

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

所以你会得到:

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

因此,你可以完成大约10个或11个迭代的任务,主要是并行。

我建议你:

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

  • 摆脱内部循环。