Java Timer:在奇怪的情况下终止,解释?

时间:2016-05-26 19:50:29

标签: java swing timer jframe

我正在编写一个非常简单的程序,每5分钟执行一次。我目前正在尝试设置一个Timer并通过简单地增加一个数字来测试它。我复制了一些代码,包括相关问题中的代码(CIQ),最后是以下内容。我注意到一种我无法解释的生活行为:

如果CIQ保留在原位,程序将按预期运行,无论延迟值是多少。但是,如果CIQ被删除,正如我试图切断我不需要的部分,例如窗口,程序自动停止所有值大致< 900.它运行了好一小时800,对于1000来说它大概是两三个,并且在没有增加任何更高的情况下终止。这里发生了什么?据我所知,CIQ指定虚拟窗口的样式然后打包它。这与在后台某处运行的计时器有什么关系,为什么会在所描述的值范围内发生?我已经读过JFrame是Swing的顶级容器,但是如果Swing的东西需要它可以工作,为什么计时器有时会在没有它的情况下工作?它与垃圾收集有什么关系吗?

时间:

    public class Time {

    public Time() {
        EventQueue.invokeLater(() -> {
            //<codeInQuestion>
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            //</codeInQuestion>

            ActionListener taskPerformer = new ActionListener() {
                int testCount = 0;

                public void actionPerformed(ActionEvent evt) {
                    System.out.println("Time passed: " + testCount);
                    testCount++;
                }
            };
            Timer timer = new Timer(1000, taskPerformer);
            timer.start();
        });
    }
}

主:

    public class Main {
    public static void main(String[] args) {
        Time timer = new Time();
    }
}

1 个答案:

答案 0 :(得分:3)

  

程序自动停止所有值大致&lt; 900。

只有在启动了事件调度线程后,应用程序才会继续运行。

由于您没有看到框架可见,因此GUI没有理由继续执行。

一个TImer在事件发生时将事件放在EDT上。对于值&lt; 900,定时器在GUI关闭之前触发,以便启动事件调度线程。

您的CIQ还必须向EDT添加一些事件以防止GUI关闭。