我正在编写一个非常简单的程序,每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();
}
}
答案 0 :(得分:3)
程序自动停止所有值大致&lt; 900。
只有在启动了事件调度线程后,应用程序才会继续运行。
由于您没有看到框架可见,因此GUI没有理由继续执行。
一个TImer在事件发生时将事件放在EDT上。对于值&lt; 900,定时器在GUI关闭之前触发,以便启动事件调度线程。
您的CIQ还必须向EDT添加一些事件以防止GUI关闭。