线程和任务的分离:线程池技术
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队列)。
:沉迷克苏鲁神话中无法自拔,那真的是没有办法整理的东东,已经是很艺术的作品。一种美丽的作品到了哲学的层次才能够算是深刻的,如果能够从一种哲学理念中学懂它是什么,它从何而来,它解决什么,那就真是一件很美的事。说到这,我现在感觉很多层面的知识越来越多,我觉得需要有一种方法论的东东,现在这种瞎耗精力的做法毕竟不能持久,我可是打算到了三四十还能每天进步的男人
以上是关于线程和任务的分离:线程池技术的主要内容,如果未能解决你的问题,请参考以下文章