美文网首页
线程池-6

线程池-6

作者: 01010100 | 来源:发表于2018-04-20 11:34 被阅读7次

try {

       Runnabler = timed ?

              workQueue.poll(keepAliveTime,TimeUnit.NANOSECONDS) :

              workQueue.take();

       if(r != null)

              returnr;

       timedOut= true;

} catch (InterruptedException retry) {

       timedOut= false;

}

继续走起,catch之后,timedOut = false,然后又回到①for循环中,再次判断线程池的状态②,前面走到interruptIdleWorkers时,线程池已是SHUTDOWN了,所以进入return null 分支,return null 之后重新回到runWorker,退出while循环,又进入到processWorkerExit方法了,然后继续tryTerminate –> interruptIdleWorkers…一个个地将闲置的线程回收,直至回收完成,线程池terminated。

for (;;) {                              //①

       intc = ctl.get();

       intrs = runStateOf(c);

       //Check if queue empty only if necessary.

       if(rs >= SHUTDOWN && (rs >= STOP || workQueue.isEmpty())) {             //②

              decrementWorkerCount();

              returnnull;

       }

整个线程池执行任务的流程就如上所述了。

接下来再来看看线程池的关闭:shutdown、shutdownNow。有了上面的基础这两个方法就很好理解了:

shutdown

     checkShutdownAccess(); //检查关闭线程池的权限

     advanceRunState(SHUTDOWN); //把线程池状态更新到SHUTDOWN

     interruptIdleWorkers(); //中断闲置的Worker

     onShutdown(); //钩子方法,默认不处理。ScheduledThreadPoolExecutor会做一些处理   

tryTerminate(); // 尝试结束线程池,上面已经分析过了

// shutdownNow方法会有返回值的,返回的是一个任务列表,而shutdown方法没有返回值

public List shutdownNow() {

   List tasks;

   final ReentrantLock mainLock = this.mainLock;

   mainLock.lock(); // shutdownNow操作也需要加锁,防止并发

   try {

       checkShutdownAccess(); //检查关闭线程池的权限

       advanceRunState(STOP); //把线程池状态更新到STOP

       interruptWorkers(); //中断Worker的运行

       tasks = drainQueue();

    }finally {

       mainLock.unlock(); //解锁

    }

   tryTerminate(); //尝试结束线程池,上面已经分析过了

   return tasks;

}

shutdownNow的中断和shutdown方法不一样,调用的是interruptWorkers方法:

然后这个方法调用的是interruptIfStarted

void interruptIfStarted() {

  Thread t;

   //Worker无论是否被持有锁,只要还没被中断,那就中断Worker

   if(getState() >= 0 && (t = thread) != null &&!t.isInterrupted()) {

      try {

          t.interrupt(); //强行中断Worker的执行

      } catch (SecurityException ignore) {

      }

   }

}

shutdown方法会更新状态到SHUTDOWN,不会影响阻塞队列里任务的执行,但是不会执行新进来的任务。同时也会回收闲置的Worker,直到任务全部执行完。

shutdownNow方法会更新状态到STOP,会影响阻塞队列的任务执行,也不会执行新进来的任务。同时会回收所有的Worker。

http://fangjian0423.github.io/2016/03/22/java-threadpool-analysis/

http://www.cnblogs.com/zhanjindong/p/java-concurrent-package-ThreadPoolExecutor.html

相关文章

  • 线程池

    1、为什么要使用线程池2、线程池的工作原理3、线程池参数4、阻塞队列5、饱和策略6、向线程池提交任务7、线程池的状...

  • C修真之旅五 常见组件上三路[转]

    第6章-武技-常见组件上三路 6.1 传说中的线程池 6.1.1 线程池接口设计 6.1.2 线程池部分实现 6....

  • 实战! 多线程线程池分析

    一 项目线程池运用 二 线程池代码分析 线程池参数这里面的参数分别为初始线程数3,最大线程数6,线程存活时间0毫秒...

  • 2021-03-10 阿里p6教你理解学习线程池

    阿里p6教你理解学习线程池 对线程或者线程池的理解程度(0-10) 线程:同时运行多个任务,提高任务处理能力 池化...

  • java知识总结-创建线程池的6种方式

    一、创建线程池的6种方式: Executors.newCachedThreadPool();创建一个可缓存线程池,...

  • 线程池-6

    try { Runnabler = timed ? workQueue.poll(keepAliveTime,...

  • java线程池

    线程VS线程池 普通线程使用 创建线程池 执行任务 执行完毕,释放线程对象 线程池 创建线程池 拿线程池线程去执行...

  • java----线程池

    什么是线程池 为什么要使用线程池 线程池的处理逻辑 如何使用线程池 如何合理配置线程池的大小 结语 什么是线程池 ...

  • 线程池

    线程池 时间 2018年6月13日 23:03:06;复习了一下基础的JAVA线程池知识 Single Threa...

  • Java线程池的使用

    线程类型: 固定线程 cached线程 定时线程 固定线程池使用 cache线程池使用 定时调度线程池使用

网友评论

      本文标题:线程池-6

      本文链接:https://www.haomeiwen.com/subject/peyakftx.html