停止自定义线程池中的所有线程(如关闭)

时间:2015-06-20 09:21:01

标签: java multithreading synchronization

在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。我怎么记得我应该再次停止线程?调用中断是否足够?

1 个答案:

答案 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);
  }
}

如果队列中的大量关闭消息等于线程数,则一旦完成所有工作,线程将各自接收关闭消息并关闭。 (注意,我们不需要关心哪个线程获取哪个关闭消息。)