什么时候java.util.Timer的后台线程在任务队列为空后终止?

时间:2015-08-29 12:39:48

标签: java timer

在java.util.Timer的文档中,它说:

  

在对Timer对象的最后一次实时引用消失并且所有未完成的任务都已完成执行之后,计时器的任务执行线程正常终止(并且变为垃圾回收)。

但是当我使用Timer执行一次性任务时:

public static void main(String[] args) throws Exception {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
            System.out.println("Timer is running");
        }
    }, 2000);
}

执行后,主线程不会终止。但它通常可以在明确取消定时器时终止,如下所示:

public static void main(String[] args) throws Exception {
    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName());
            System.out.println("Timer is running");
        }
    }, 2000);
    Thread.sleep(2000);
    timer.cancel();
}

执行后,任务队列为空,不再执行任务,但线程未终止。线程转储显示:

"Timer-0" prio=5 tid=0x00007ff184046000 nid=0x5807 in Object.wait() [0x000000011ebea000]
java.lang.Thread.State: WAITING (on object monitor)  
at java.lang.Object.wait(Native Method)  
- waiting on <0x00000007ab1bbea0> (a java.util.TaskQueue)  
at java.lang.Object.wait(Object.java:503)  
at java.util.TimerThread.mainLoop(Timer.java:526)  
- locked <0x00000007ab1bbea0> (a java.util.TaskQueue)  
at java.util.TimerThread.run(Timer.java:505) 

计时器后台线程仍处于等待状态。这里发生了什么?

0 个答案:

没有答案