我有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);
ScheduledExecutorService的:
Thread task = new Thread()
{
@Override
public void run()
{
System.out.println("doing something");
}
};
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.schedule(task, 250, TimeUnit.MILLISECONDS);
答案 0 :(得分:2)
在您的第二个代码段中,您已创建了Thread
个实例,但ScheduledExecutorService
已将该实例用作Runnable
,即。它只关心它的run
方法。它start
实际上并非Thread
。
ScheduledExecutorService
维护自己的Thread
(s)来执行任务。使用newSingleThreadScheduledExecutor
,这是一个非守护进程Thread
。您需要shutdown
ScheduledExecutorService
才能完成Thread
。
对
Timer
对象的最后一次实时引用消失后全部消失 未完成的任务已完成执行,计时器的任务执行 线程优雅地终止(并成为垃圾 集合)。
执行完TimerTask
后,它将完成其内部线程。