以下程序假设每秒打印一次日期。然而,由于一个已知的原因,这不起作用。
我在以下类和actionPerformed方法中实现了ActionListener接口:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
public class CurrentTimePrinter implements ActionListener{
public void actionPerformed(ActionEvent e){
System.out.println(new Date());
}
}
这是测试人员类:
import java.awt.event.ActionListener;
import javax.swing.Timer;
public class CurrentTimePrinterTester {
public static void main(String[] args) {
ActionListener listener = new CurrentTimePrinter();
Timer t = new Timer(1000, listener);
t.start();
}
}
答案 0 :(得分:2)
您需要在non-daemon thread上执行代码。目前发生的是Timer
作为守护程序线程启动,但是main
返回JVM退出。
您可以从EDT(非守护进程)启动计时器,如下所示:
public static void main(String[] args) {
ActionListener listener = new CurrentTimePrinter();
SwingUtilities.invokeLater(() -> new Timer(1000, listener).start());
}
这可以使JVM保持活跃状态。
关于线程的一些额外说明:
swing.Timer
是一个简化的类,可以自定义用于GUI。这带来了灵活性较差的缺点。所有这些定时器运行的线程都在后台设置并且是守护进程。
util.Timer
默认情况下是非守护程序线程,可灵活地为created otherwise。每个计时器都有自己的线程。