繁体   English   中英

ScheduledExecutorService不会像Timer那样结束线程

[英]ScheduledExecutorService does not end thread like Timer

我有2个代码段,一个使用ScheduledExecutorService在特定时间执行线程,另一个使用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);

使用计时器时的线程数

ScheduledExecutorService的:

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

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

使用ScheduledExecutorService时的线程数

在第二个片段中,您创建了一个Thread实例,但是ScheduledExecutorService将该实例用作Runnable ,即。 它只关心其run方法。 它实际上并没有start Thread

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

Timer状态的Javadoc

在最后一个对Timer对象的实时引用消失并且所有未完成的任务均已完成执行之后,计时器的任务执行线程会正常终止(并受到垃圾回收的影响)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM