当 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()吗?
java thread.sleep 也让 swing ui 进入睡眠状态