我在实现ScheduledExecutorService(特别是scheduleAtFixedRate)方面存在延迟问题。
程序必须显示一个JLabel(包含一个图像),然后在3.5秒后隐藏它并显示另一个JLabel(也带有一个图像),并在隐藏它并再次显示第一个之后3.5秒,然后全部完成再次在无限循环中。
所以这是我的代码:
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class CyclicImages extends javax.swing.JFrame {
boolean flag = false;
public CyclicImages() {
initComponents();
//This two lines are in my class constructor
ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
executor.scheduleAtFixedRate(cyclic, 3500, 3500, TimeUnit.MILLISECONDS);
}
Runnable cyclic = new Runnable() {
public void run() {
while(true) {
if(flag == false) {
imgFirst.setVisible(false);
imgSecond.setVisible(true);
flag = true;
break;
} else {
imgSecond.setVisible(false);
imgFirst.setVisible(true);
flag = false;
break;
}
}
}
};
}
那么,如果我运行该程序,它可以很好地进行6或7次迭代,然后反复延迟并丢失3.5秒参数。
我的问题是,为什么会在ScheduledExecutorService中发生这种情况?与thread.sleep()方法不同,它不应该永远不会发生?
注意:我没有使用任何事件(actionPerfomed等)来启动计划。
更新:我更改了scheduleAtFixedRate行:executor.scheduleWithFixedDelay(cyclic, 3500, 3500, TimeUnit.MILLISECONDS);
并删除了while(true)
循环及其各自的中断,但我的程序仍然延迟。