自己动手写线程池——向JDK线程池进发( 三 )

拒绝策略的实现根据前面提到的各种策略的具体实现方式,具体的代码实现如下所示:
  private void reject(Runnable runnable) throws InterruptedException {    switch (policy) {      case ABORT:        throw new RuntimeException("task queue is full");      case CALLER_RUN:        runnable.run();      case DISCARD: // 直接放弃这个任务        return;      case DISCARD_OLDEST:        // 放弃等待时间最长的任务 也就是队列当中的第一个任务        taskQueue.poll();        execute(runnable); // 重新执行这个任务    }  }线程池关闭实现一共两种方式实现线程池关闭:

  • 直接关闭线程池,不管任务队列当中的任务是否被全部执行完成 。
  • 安全关闭线程池 , 先等待任务队列当中所有的任务被执行完成,再关闭线程池,但是在这个过程当中不允许继续提交任务了,这一点已经在函数 checkPoolState 当中实现了 。
【自己动手写线程池——向JDK线程池进发】  // 强制关闭线程池  public synchronized void stop() {    isStopped = true;    for (Worker worker : workers) {      worker.stopWorker();    }  }  public synchronized void shutDown() {    // 先表示关闭线程池 线程就不能再向线程池提交任务    isStopped = true;    // 先等待所有的任务执行完成再关闭线程池    waitForAllTasks();    stop();  }  private void waitForAllTasks() {    // 当线程池当中还有任务的时候 就不退出循环    while (taskQueue.size() > 0) {      Thread.yield();      try {        Thread.sleep(1000);      } catch (InterruptedException e) {        e.printStackTrace();      }    }  }工作线程的工作实现    @Override    public void run() {      // 先执行传递过来的第一个任务 这里是一个小的优化 让线程直接执行第一个任务 不需要      // 放入任务队列再取出来执行了      firstTask.run();      thisThread = Thread.currentThread();      while (!isStopped) {        try {          // 是否使用时间就在这里显示出来了          Runnable task = useTimed ? taskQueue.poll(keepAliveTime, unit) : taskQueue.take();          if (task == null) {            int i;            boolean exit = true;            // 如果当前线程数大于核心线程数 则使用 CAS 去退出 用于保证在线程安全下的退出            // 且保证线程的个数不小于 corePoolSize 下面这段代码需要仔细分析一下            if (ct.get() > corePoolSize) {              do{                i = ct.get();                if (i <= corePoolSize) {                  exit = false;                  break;                }              }while (!ct.compareAndSet(i, i - 1));              if (exit) {                return;              }            }          }else {            task.run();          }        } catch (InterruptedException e) {          // do nothing        }      }    }

推荐阅读