1

我有这个:

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 中运行它时,它似乎立即完成而不打印任何东西。

发生了什么?如何解决?

4

1 回答 1

3

首先,您需要从 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();
    }
于 2018-11-30T13:46:37.077 回答