ScheduledExecutorService 不会像 Timer 那样结束线程

ScheduledExecutorService does not end thread like Timer

我有2段代码,一段使用ScheduledExecutorService在某个时间执行一个Thread,另一个使用Timer在某个时间执行一个TimerTask。问题是在使用 ScheduledExecutorService 时,即使线程的 运行() 到达末尾,监控程序也会指示它仍然存在(请参见下图)。另一方面,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);

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

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

javadoc of Timer 状态

After the last live reference to a Timer object goes away and all outstanding tasks have completed execution, the timer's task execution thread terminates gracefully (and becomes subject to garbage collection).

在它执行完你的TimerTask之后,它会完成它的内部线程。