线程和任务的分离:线程池技术

Posted 折花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程和任务的分离:线程池技术相关的知识,希望对你有一定的参考价值。

  感觉对线程池的理解非常浅,主要体现在对线程复用的过程不理解,线程和任务的分离是如何做到的,今天专门翻开ThreadPoolExecutor类源码弄清整个流程,JDK版本为1.8.

  Worker作为核心内部类实现了AQS和Runnable,并使用Thread来封装自己,使用Runnable表示一个任务,Worker是执行任务的执行者。当线程池的核心不满时,每一个提交任务都会创建Worker并统一在hashset中,达到核心数后,任务放置在blockqueue中,不再添加执行者。

  目前的Worker仍然不能复用,尽管已经实现任务和线程的分离。

  具体的复用逻辑在Worker的执行过程中,上文提到任务的提交过程,这是线程池的基本功能,提交过程粗略如下:1、将Runnable任务提交,2、初始化Worker,参数为Runnable,使用Thread封装自己,3、执行Worker的Thread的start,4、start调用run,5、run中逻辑为runWorker函数,6、runWorker使用当前线程执行Runnable任务,并且查看任务队列中是否有未执行任务(Runnable),运行任务直到队列为空。

  它的注释中有极其多的干货,关于锁、并发集合、位运算,线程池中另一套内部类是拒绝执行策略。另外,AQS目前理解不够,所以先单独划开了。

  关于Hashset和mainLock,为什么不用并发集合呢?虽然我们可以使用某种类型的并发集合,但是通常最好使用锁,因为锁会串行化中断执行线程,从而避免中断风暴,毕竟锁是AQS(一个FIFO队列)。

  :沉迷克苏鲁神话中无法自拔,那真的是没有办法整理的东东,已经是很艺术的作品。一种美丽的作品到了哲学的层次才能够算是深刻的,如果能够从一种哲学理念中学懂它是什么,它从何而来,它解决什么,那就真是一件很美的事。说到这,我现在感觉很多层面的知识越来越多,我觉得需要有一种方法论的东东,现在这种瞎耗精力的做法毕竟不能持久,我可是打算到了三四十还能每天进步的男人

   

以上是关于线程和任务的分离:线程池技术的主要内容,如果未能解决你的问题,请参考以下文章

Java线程池 Executor框架概述

J.U.C之线程池

线程池怎么保证线程按次序执行任务?

线程池技术优化

unix中的线程池技术详解

JAVA线程池shutdown和shutdownNow的区别