【问题标题】:Java Timer.schedule task doesn't run at allJava Timer.schedule 任务根本不运行
【发布时间】:2024-01-11 20:57:01
【问题描述】:

我有这个:

import java.util.Timer;
import java.util.TimerTask;

    public class useTimerTask {
        public static void main(String[] args){
            Timer timer = new Timer(true);
            timer.schedule(new TimerTask() {
                public void run() {
                    System.out.println("abc");
                }
            }, 200000 , 1000);
        }
    }

我希望在我运行这个程序后,屏幕上会有周期性的输出。但是当我在 intelliJ 中运行它时,它似乎立即完成而不打印任何东西。

发生了什么?如何解决?

【问题讨论】:

  • 我会说Timer 是非阻塞的,主线程立即停止。显示了锁定/阻塞对象的解决方法here
  • 分享错误日志将有助于找到解决方案
  • 你必须在你的主线程中等待你的计时器

标签: java timer task schedule


【解决方案1】:

首先,您需要从 Timer 的构造函数中删除参数。通过传递true,您可以指定线程是“守护进程”:守护线程不会阻止 JVM 在所有非守护线程完成后退出。

第二件事是将延迟参数设置为 200 分钟。这意味着在程序开始重复 println 之前您必须等待 200 分钟。 以下是工作版本:

       Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            public void run() {
                System.out.println("abc");
            }
        }, 100 , 1000);

如果您将 Timer 设置为守护进程,JVM 将看到没有活动线程,并在调度计时器指令完成时停止终止您的程序。但是如果你从 Timer 构造函数中删除参数“true”,它将作为一个活动线程可见,这意味着程序不会停止,直到这个计时器完成他的工作。

下面的代码显示了这种情况。计时器将工作 10 秒,因为您睡眠主线程并且计时器(守护程序)将工作,直到此睡眠完成。

    Timer timer = new Timer(true);
    timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("abc");
        }
    }, 100 , 1000);

    try {
        Thread.sleep(10000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【讨论】:

    最近更新 更多