0
在Java库线程池实现,通常关停池是指:停止在自定义线程池中的所有线程(如关闭)
- 停止受理执行
新任务-previously提交的任务
- 所有池中的线程终止
关于最后一点,你将如何停止池中的线程可能尝试采取新的任务,之后已被停止?
我的线程做这样的事情(在Java伪代码):
public void run() {
while(!isStopped) {
Task task = taskQueue.take(); //line1
task.run(); //line2
}
}
,并有一个方法停止:
public synchronized void stop(){
isStopped = true;
this.interrupt();
}
在我的线程池类,我有一个方法停止:
public synchronized void shutdown(){
this.isShutdown = true; //to stop the whole pool
for(PoolThread thread : threads)
thread.stop();
}
的一点是,如果一个线程到达线1,isStopped是假的,但在第同时它可以被泳池类设置为真。我怎么记得我应该再次停止线程?调用中断是否足够?
感谢。我喜欢这个解决方案。关于shutdownNow怎么样?这就像关机,但只有已经执行任务的线程可以终止他们的工作。没有新任务可以添加到队列中。也许,这足以清空队列(同步)并重用这个相同的想法?我认为它可以工作。你说什么?当然,如果一个线程花了很长时间来完成一个任务,这将阻止整个关闭(但如果我没有弄错,这对java库线程池也是如此)。 – Kami
如果得到一个关机消息线程终止自己之前它重新排队,需要任意数量的线程池只有一个关闭消息。 –
@Kami:对于'shutdownNow'是,你要排在队列和中断线程,以及发送关闭消息。 – user2357112