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

Stop all threads in a custom thread pool (like shutting down)

在 Java 库线程池实现中,通常关闭池意味着:

-停止接受新任务

-之前提交的任务被执行

-所有池线程都已终止

关于最后一点,它被停止后,您如何停止可能尝试接受新任务的池线程?

我的线程做这样的事情(在 java 伪代码中):

public void run() {
  while(!isStopped) {
    Task task = taskQueue.take(); //line1
    task.run(); //line2
  }
}

并有一个方法停止:

public synchronized void stop(){
  isStopped = true;
  this.interrupt();
}

在我的线程池class中,我有一个方法停止:

public synchronized void shutdown(){
  this.isShutdown = true; //to stop the whole pool
  for(PoolThread thread : threads)
    thread.stop();
}

重点是,如果线程到达第 1 行,isStopped 为假,但在同一时刻它可以被池设置为真 class。我怎么记得我应该再次停止线程?调用中断是否足够?

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

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

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