在Java库线程池实现中,通常关闭池意味着:
- 停止接受新任务
- 以前提交的任务已执行
- 所有池线程终止
关于最后一点,你如何阻止可能尝试接受新任务的池线程在停止后?
我的线程执行类似这样的操作(在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为false,但同时它可以由池类设置为true。我怎么记得我应该再次停止线程?调用中断是否足够?
答案 0 :(得分: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);
}
}
如果队列中的大量关闭消息等于线程数,则一旦完成所有工作,线程将各自接收关闭消息并关闭。 (注意,我们不需要关心哪个线程获取哪个关闭消息。)