2015-06-20 149 views
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是假的,但在第同时它可以被泳池类设置为真。我怎么记得我应该再次停止线程?调用中断是否足够?

回答

1

通过任务队列发送关闭消息:

static Task stop = // some special value 

public void run() { 
    while (true) { 
    Task task = taskQueue.take(); 
    if (task == stop) { 
     break; 
    } 
    task.run(); 
    } 
} 

shutDown

public synchronized void shutdown(){ 
    if (isShutdown) { 
    return; 
    } 
    this.isShutdown = true; 
    for(PoolThread thread : threads) { 
    taskQueue.put(PoolThread.stop); 
    } 
} 

与队列等于线程的数量,一旦所有的一些停产的消息工作完成后,线程将分别接收关闭消息并关闭。 (请注意,我们并不需要关心哪个线程获取其关闭消息。)

+0

感谢。我喜欢这个解决方案。关于shutdownNow怎么样?这就像关机,但只有已经执行任务的线程可以终止他们的工作。没有新任务可以添加到队列中。也许,这足以清空队列(同步)并重用这个相同的想法?我认为它可以工作。你说什么?当然,如果一个线程花了很长时间来完成一个任务,这将阻止整个关闭(但如果我没有弄错,这对java库线程池也是如此)。 – Kami

+1

如果得到一个关机消息线程终止自己之前它重新排队,需要任意数量的线程池只有一个关闭消息。 –

+0

@Kami:对于'shutdownNow'是,你要排在队列和中断线程,以及发送关闭消息。 – user2357112