ScheduledExecutorService.scheduleAtFixedRate在多次迭代后被延迟

时间:2015-05-11 05:15:10

标签: java delay infinite-loop schedule scheduledexecutorservice

我在实现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)循环及其各自的中断,但我的程序仍然延迟。

0 个答案:

没有答案