java定时器赢得';行不通

java定时器赢得';行不通,java,timer,Java,Timer,为什么这样不行 我希望它每秒钟打印一次 谢谢 import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.Timer; public class test2 { public static void main(String[] args) { Timer timer = new Timer(1000, new ActionListener() {

为什么这样不行

我希望它每秒钟打印一次

谢谢

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class test2 {

public static void main(String[] args) {

    Timer timer = new Timer(1000, new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            System.out.println("hello");
        }
    });

    timer.start();
    }
}

您正在使用接口库(
java.awt
)编写控制台应用程序

试试这个:

public static void main(String[] args) throws Exception {
     while(true){
         Thread.sleep(1000);
         System.out.println("hello");
     }
}

在调用
start
后,没有任何东西可以阻止您的代码立即退出。添加
线程睡眠(10000)
定时器.start()之后之后,您将看到打印的消息。

可能计时器是在守护进程线程中启动的,启动后,主线程立即完成


只要只剩下守护进程线程,JVM就可能/必须终止。因此,您需要保持主线程处于活动状态。出于测试目的,一个简单的
线程睡眠(10000)应该很好。

您的程序在计时器运行一次之前就终止了。当主方法终止时,程序终止,所有线程也将终止。这包括您的计时器线程

请尝试以下操作:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

public class test2 {

    public static void main(String[] args) {

        Timer timer = new Timer(1000, new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.out.println("hello");
            }
        });

        timer.start();
        }

        while (true) /* no operation */;
    }
}

因为您的程序将在主线程完成后很快退出,并且由于计时器在单独的线程上运行,所以它没有时间执行。在主方法结束之前添加一个Thead.Sleep调用将执行您的代码。

这可能是GUI应用程序的起点,减少到不按预期工作的最低代码量。您的答案的可能副本在概念上是正确的,但是请注意,swing计时器不会在单独的守护程序线程上运行。而是从事件调度线程检查它们。感谢您的更正。我已经七年没有和Swing一起工作了谢谢,这很有效,但还有其他解决方案吗?