javax.swing.Timer的奇怪行为

时间:2012-02-05 19:41:15

标签: java multithreading swing

如果使用以下代码,则在main中

Timer timer = new Timer(200, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("boo");
    }
});

timer.start();
Thread.sleep(3000);

boo将按预期每200毫秒打印一次。

虽然

Timer timer = new Timer(200, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("boo");
    }
});

timer.start();

什么都不会输出!

4 个答案:

答案 0 :(得分:3)

据推测,您展示的代码位于main()。当main()返回时,程序在计时器线程有机会开始之前退出。 sleep为JVM提供了足够的时间来创建另一个线程,然后允许JVM继续运行。

答案 1 :(得分:1)

可能是Thread.sleepmain线程上,并且在第二种情况下没有打印的原因是main线程消失了,程序退出了吗? / p>

答案 2 :(得分:1)

这是完整的程序(是main方法中唯一的代码吗?)如果是,则在第二种情况下程序在计时器关闭之前结束,因此它不会打印任何内容,因为程序几乎立即完成。

答案 3 :(得分:1)

1)此代码在所有情况下都是正确的

Timer timer = new Timer(200, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("boo");
    }
});    
timer.start();

你必须检查javax.swing.Timer#setRepeats()是否有真值(默认值),如果没有更改,否则你有一个阻止Event Dispatch Thread的代码,然后是Swing's Timer

2)在EDT期间不要使用Thread.sleep(int),直到睡眠结束导致EDT的代码块,