这是代码:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;
public class TimerSample {
public static void main(String args[]) {
new JFrame().setVisible(true);
ActionListener actionListener = new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
System.out.println("Hello World Timer");
}
};
Timer timer = new Timer(500, actionListener);
timer.start();
}
}
它生成一个窗口,然后定期在终端(命令提示符)中打印“Hello World Timer”。如果我评论这一行new JFrame().setVisible(true);
应用程序不会向命令行打印任何内容。为什么?
ADDED:
我不确定我是否正确理解了答案。据我了解,计时器启动一个新线程。并且这个新线程与“主”线程同时存在。当“主”线程完成时(当一切都完成并且不再有任何事情可做时),整个应用程序将终止(与计时器创建的“新”线程一起)。是对的?
ADDED 2:
上面的解释仍然没有说明一切。例如,如果我评论该程序,则该程序将运行new JFrame().setVisible(true);
并把try {Thread.sleep(20000);} catch(InterruptedException e) {};
之后的timer.start()
。所以,我有点理解这一点。通过睡眠,我们保持“主”线程忙碌,以便计时器创建的线程可以存在。但new JFrame().setVisible(true);
不占据“主”。据我了解,它创建自己的线程(如计时器)。那么,为什么JFrame的线程可以脱离主线程而存在,而timer的线程却不能呢?
你没有抓住要点。计时器独立于您创建的窗口,并且当您注释掉该窗口创建行时它也可以工作。
然而,您没有看到的是:您的主程序在之后退出timer.start()
,因此,您的程序执行被终止,计时器也随之终止。
如果您添加,您可以验证这一点Thread.sleep(20000);
最后(包括所需的异常处理),或任何其他需要一些时间的代码。然后,即使没有创建任何窗口,您的计时器也可以正常工作。
要点是,即使没有显示任何内容,JFrame 仍保持活动状态,这反过来又使计时器保持活动状态。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)