加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如果我们不生成窗口,为什么Timer不起作用?

发布时间:2020-12-15 08:32:48 所属栏目:Java 来源:网络整理
导读:这是代码: 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); ActionL
这是代码:

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”.如果我评论这一行新的JFrame().setVisible(true);应用程序不会在命令行中打印任何内容.为什么?

添加:

我不确定我是否正确理解答案.据我所知,计时器启动一个新线程.并且这个新线程与“主”线程同时存在.当“主”线程完成时(当一切都完成并且没有任何事情可做)时,整个应用程序终止(与定时器创建的“新”线程一起).是正确的?

增加2:

上述说明仍然没有解释所有内容.例如,如果我评论新的JFrame(),程序就可以工作.setVisible(true);并把try {Thread.sleep(20000);} catch(InterruptedException e){};在timer.start()之后.所以,我有点理解.使用sleep,我们保持“main”线程忙,这样定时器创建的线程就可以存在.但是新的JFrame().setVisible(true);不要占据“主力”.据我所知,它创建了自己的线程(如Timer).那么,为什么JFrame的线程可以在没有主线程和定时器线程的情况下存在呢?

解决方法

你错过了这一点. Timer与您创建的窗口无关,当您注释掉该窗口创建行时,它也可以工作.

但是,您未能看到的是:您的主程序在timer.start()之后退出,因此,您的程序执行将终止并随之进入计时器.

如果添加Thread.sleep(20000),可以验证这一点;最后(包括所需的异常处理),或任何其他需要一些时间的代码.然后你的计时器工作正常,即使没有创建任何窗口.

关键是即使没有显示任何内容,JFrame仍然处于活动状态,这反过来会使您的计时器保持活动状态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读