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
。
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
之后,它会完成它的内部线程。
我有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
。
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
之后,它会完成它的内部线程。