ScheduledExecutorService不会像Timer一样结束线程

时间:2015-11-04 23:57:53

标签: java multithreading timer scheduledexecutorservice

我有2个代码片段,一个使用ScheduledExecutorService在某个时间执行一个Thread,另一个使用Timer在某个时间执行一个TimerTask。问题是在使用ScheduledExecutorService时,即使线程的run()到达结尾,监视程序也会指示它仍处于活动状态(参见下图)。另一方面,TimerTask在执行完成后结束其线程。

我已将ScheduledExecutorService的Thread更改为TimerTask,但收到了相同的结果。如何在使用ScheduledExecutorService时解决问题?

定时器:

    TimerTask task = new TimerTask()
    {
        @Override
        public void run()
        {
            System.out.println("doing something");
        }
    };

    Timer t = new Timer();
    t.schedule(task, 250);

Thread count while using Timer

ScheduledExecutorService的:

    Thread task = new Thread()
    {
        @Override
        public void run()
        {               
            System.out.println("doing something");
        }
    };

    ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
    scheduler.schedule(task, 250, TimeUnit.MILLISECONDS);

Thread count while using ScheduledExecutorService

1 个答案:

答案 0 :(得分:2)

在您的第二个代码段中,您已创建了Thread个实例,但ScheduledExecutorService已将该实例用作Runnable,即。它只关心它的run方法。它start实际上并非Thread

ScheduledExecutorService维护自己的Thread(s)来执行任务。使用newSingleThreadScheduledExecutor,这是一个非守护进程Thread。您需要shutdown ScheduledExecutorService才能完成Thread

javadoc of Timer

  

Timer对象的最后一次实时引用消失后全部消失   未完成的任务已完成执行,计时器的任务执行   线程优雅地终止(并成为垃圾   集合)。

执行完TimerTask后,它将完成其内部线程。