网上对Java线程池都有很多非常具体的解析,我概念性进行总结下,如有错误,可与我联系修改。

一、 ThreadPool Executor

一个线程池包括以下四个基本组成部分:

    1、线程池管理器(ThreadPool):用于创建并管理线程池,包括 创建线程池,销毁线程池,添加新任务;

    2、工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务;

    3、任务接口(Task):每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

    4、任务队列(taskQueue):用于存放没有处理的任务。提供一种缓冲机制。

工作方式:

线程池有一个工作队列,队列中包含了要分配给各线程的工作。当线程空闲时,就会从队列中认领工作。由于线程资源的创建与销毁开销很大,所以ThreadPool允许线程的重用,减少创建与销毁的次数,提高效率。

流程图细节:

1.2 ForkJoinPool Executor

ForkJoinPool组成类:

    1,ForkJoinPool:充当fork/join框架里面的管理者,最原始的任务都要交给它才能处理。它负责控制整个fork/join有多少个workerThread,workerThread的创建,激活都是由它来掌控。它还负责workQueue队列的创建和分配,每当创建一个workerThread,它负责分配相应的workQueue。然后它把接到的活都交给workerThread去处理,它可以说是整个frok/join的容器。

    2,ForkJoinWorkerThread:fork/join里面真正干活的"工人",本质是一个线程。里面有一个ForkJoinPool.WorkQueue的队列存放着它要干的活,接活之前它要向ForkJoinPool注册(registerWorker),拿到相应的workQueue。然后就从workQueue里面拿任务出来处理。它是依附于ForkJoinPool而存活,如果ForkJoinPool的销毁了,它也会跟着结束。

     3,ForkJoinPool.WorkQueue: 双端队列就是它,它负责存储接收的任务。

     4,ForkJoinTask:代表fork/join里面任务类型,我们一般用它的两个子类RecursiveTask、RecursiveAction。这两个区别在于RecursiveTask任务是有返回值,RecursiveAction没有返回值。任务的处理逻辑包括任务的切分都集中在compute()方法里面。

工作方式:

ForkJoinPool是JDK7引入的线程池。使用一种分治算法,递归地将任务分割成更小的子任务,其中阈值可配置,然后把子任务分配给不同的线程执行并发执行,最后再把结果join组合起来。该用法常见于数组与集合的运算。

也是AbstractExecutorService的子类,引入了“工作窃取”(work-stealing)机制,在多CPU计算机上处理性能更佳。

工作窃取机制是ForkJoinPool提供的一个更有效的利用线程的机制,当ThreadPoolExecutor还在用单个队列存放任务时,ForkJoinPool已经分配了与线程数相等的队列,当有任务加入线程池时,会被平均分配到对应的队列上,各线程进行正常工作,当有线程提前完成时,会从队列的末端“窃取”其他线程未执行完的任务,当任务量特别大时,CPU多的计算机会表现出更好的性能。

流程图细节:

1.3 应用场景

1、应用场景对比

  • ThreadPool

    • 常用于线程并发,阻塞时延较长的任务。这种任务一般要求的线程个数较多;
  • ForkJoinPool
    • 用于大任务可分解成小任务,一般是非阻塞的、可以快速处理的任务;或者阻塞时延较小的任务。

2、基本功能原理

  • ThreadPool

    • 其思想就是实现造出一批线程放到一个集合中,等到有任务来的时候,直接从线程集合中取出一个线程执行任务。这样就把每个线程的创建、连接、销毁等过程统一管理,节省系统时间,提高系统稳定性。
  • ForkJoinPool
    • 类似于MapReduce任务分解聚合模式, ForkJoinPool采用先将大任务fork成多个小任务,然后再将每个小人物的接口join在一起,进而得出大任务的结果。

3、阻塞队列个数

  • ThreadPool

    • 一般是一个阻塞队列。阻塞队列的类型有:

      • ArrayBlockingQueue :是一个有界缓存队列,可以指定缓存队列的大小。当正在执行的线程数等于核心线程数时,新的任务会放到ArrayBlockingQueue队列中,当ArrayBlockingQueue队列已满时,会新开线程执行任务,等到线程数等于最大线程数时,再进来的任务时ArrayBlockingQueue就会报错;
      • LinkedBlockingDeque :是一个无界缓存等待队列,当前执行的线程数等于核心线程数时,新来的任务就会在LinkedBlockingDeque队列中等待(从现像上看使用该缓存队列时最大线程数参数相当于无效了);
      • SynchronousQueue :SynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者,必须等队列中的添加元素被消费后才能继续添加新的元素。
  • ForkJoinPool
    • 每个线程都有一个队列。如果一个线程的队列执行完成,可以从其他线程队列的末尾拿出一个任务执行;

线程池之ThreadPool与ForkJoinPool相关推荐

  1. Android多线程:这是一份全面 详细的线程池(ThreadPool)讲解教程

    前言 对于多线程,大家应该很熟悉.但是,大家了解线程池吗? 今天,我将带大家全部学习关于线程池的所有知识. 目录 1. 简介 2. 工作原理 2.1 核心参数 线程池中有6个核心参数,具体如下 上述6 ...

  2. Java线程池(ThreadPool)详解

    线程五个状态(生命周期): 线程运行时间 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中执行任务的时间,T3 销毁线程时间. 如果:T1 + T3 远大于 T2,则可以采用线 ...

  3. python线程池(threadpool)模块使用笔记详解

    这篇文章主要介绍了python线程池(threadpool)模块使用笔记详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 最近在做一个视频设备管理的项目,设备包括(摄像 ...

  4. python线程池模块第三方包_python线程池(threadpool)模块使用笔记详解

    最近在做一个视频设备管理的项目,设备包括(摄像机,DVR,NVR等),包括设备信息补全,设备状态推送,设备流地址推送等,如果同时导入的设备数量较多,如果使用单线程进行设备检测,那么由于设备数量较多,会 ...

  5. java多线程线程池_Java多线程——线程池(ThreadPool)

    我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...

  6. Linux下线程池(ThreadPool)

    目录 一.线程池相关概念及其优点 二.线程池的实现 一.线程池相关概念及其优点 线程池一种线程使用模式,线程过多会带来这个调度的开销进而影响整体的性能,而线程池是提前准备好了线程等待着管理者进行分配任 ...

  7. python线程池(threadpool)模块使用python2.7

    一.安装与简介 pip install threadpool pool = ThreadPool(poolsize) requests = makeRequests(some_callable, li ...

  8. 线程池之ForkJoinPool

    概述 ForkJoinPool分支/合并框架,就是在必要的情况下,将一个大任务拆分(fork)成若干个小任务(拆到不能再拆为止),再将一个个的小任务运算的结果进行Join汇总. ThreadPool与 ...

  9. 深入剖析JDK线程池ThreadPool

    前言 线程池是java人员在工作中经遇到的一个技术,也是一个技术难点,最近遇到一个生产环境线程池使用问题,今天特针对源码和平时的工作经验,对ThreadPoolExecutor进行一个全面的剖析 1. ...

最新文章

  1. 划水是程序员必备的技能吗? | 每日趣闻
  2. Java字符编码的转化问题
  3. C++socket编程(三):3.1 TCP/IP协议特点
  4. efuse 加密文件 linux,乐鑫关于“故障注入”和 “eFuse 保护”的安全建议 (CVE-2019-17391)...
  5. RabbitMQ中BasicGet与BasicConsume的区别
  6. 对付洗稿者的一个脑洞
  7. oracle估算数据增长,如何估算oracle 数据库,数据库对象历史增长情况
  8. 《深入理解计算机系统》家庭作业
  9. 【详解】EL表达式和JSTL标签库的使用
  10. java有关物流管理的简历_Java开发实习生大学生简历模板
  11. 计算机创新课堂教案,1 1.1计算机概述1.2计算机系统课堂教学教案
  12. c#绝对值函数图像_C# 中如何取绝对值函数
  13. could not find driver
  14. ubuntu16.04下利用ROS启动LPMS-CURS、CURS2等型号IMU;用imu控制turtlesim--教程
  15. 关于 360 度评估
  16. 谷歌使用人工智能来预测航班延误
  17. 探讨Linux CPU的上下文切换原由
  18. Crawlab(crawlab github)
  19. 笔记 ~ 第二章 - 2.2 关系操作、关系完整性、关系代数、关系演算
  20. mysql 主备切换关于虚拟ip理解

热门文章

  1. 表格中内容过多时采用省略号,鼠标移上去显示全部内容
  2. Windows环境下使用Linux命令
  3. Java JDBC工具类
  4. 计算机行业的pest分析,2014-2018年中国电脑外设行业市场发展现状及未来趋势调研报告...
  5. 微服务模块综合管理(模块视图管理,自动化热部署,前端资源实时刷新......)
  6. java array 元素的位置_208道高频 Java面试题答案2
  7. python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv
  8. ubuntu install opencv
  9. Nginx+FastCGI支持HTTPS部署过程详述
  10. 理解 Python 中的异步编程