Java Timer.schedule 任务根本 运行
Java Timer.schedule task doesn't run at all
我知道了:
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 的构造函数中删除参数。通过传递 true
,您指定线程是 "deamon":守护线程不会阻止 JVM 在所有非守护线程完成时退出。
第二件事是您将延迟参数设置为 200 分钟。这意味着在程序开始重复 println 之前你必须等待 200 分钟。
以下是工作版本:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("abc");
}
}, 100 , 1000);
如果您将定时器设置为守护进程,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();
}
我知道了:
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 的构造函数中删除参数。通过传递 true
,您指定线程是 "deamon":守护线程不会阻止 JVM 在所有非守护线程完成时退出。
第二件事是您将延迟参数设置为 200 分钟。这意味着在程序开始重复 println 之前你必须等待 200 分钟。 以下是工作版本:
Timer timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("abc");
}
}, 100 , 1000);
如果您将定时器设置为守护进程,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();
}