JDK的线程池,它是预先创建好一些线程,放在池中。用的时候从池中取线程,用完放回池中。
避免了创建,销毁线程的开销。与数据库连接池是同样的道理。

1.固定数量的线程池 newFixedThreadPool

作用:这是一个线程数固定的,线程可以重用的线程池,用共享的无界队列方式运行这些线程。
如果所有的核心线程都在忙,这时又有新的任务来,这个新的任务会去队列中等待。
如果一个线程在半路突然中止了,那么会有一个新的线程代替它执行后续的任务。
一个线程在被关闭之前,它会一直在线程池中等待被调用。(下班前,要一直在公司等着干活,不能回家)

特征:
1.线程池中线程的量固定,可以控制线程的并发量。
2.线程可以被重复利用
3.任务数超出核心线程数时,那些额外的任务需要去队列中等待。如果队列中都挤满了,又有新的任务来,就会派额外的新线程去接客。如果达到了最大线程数后,还有新的任务来,那就直接抛异常吧,干不了了。

创建方式:
1.Executors.newFixedThreadPool(int nThreads); //参数为线程的总数
2.Executors.newFixedThreadPool(int nThreads,ThreadFactory threadFactory); //参数为线程的总数 和 创建线程的工厂

通过看底层源码发现,这种线程池最终是通过实例化ThreadPoolExecutor来实现的。
ThreadPoolExecutor的构造方法有很多参数:

  1. corePoolSize:核心线程数
  2. maxImumPoolSize:最大线程数 (如果它和核心线程数相等时,即没有后备外援了,如果此时队列中的任务也满了,如果再有任务来,就抛异常)
  3. keepAliveTime: 是指那些后备外援线程的 最大存活时间。
  4. unit:时间单位
  5. workQueue:工作队列,存放要执行的任务的地方。
  6. threadFactory:创建线程的工厂
    还有一个Handler,拒绝策略。
    拒绝策略有4种:
    1.AbortPolicy:这个比较简单粗暴,直接抛出异常,也是默认的拒绝策略。(上面构造方法中的defaultHandler就指的是它)
    2.CallerRunsPolicy:直接在调用线程中执行该任务。
    3.DiscardPolicy:直接将该任务丢弃。
    4.DiscardOldestPolicy:丢弃最老的未被执行的任务,这样队列中就有地方了,把这个新任务放到队列中

2.缓存线程池 newCachedThreadPool

作用:它是根据需要,创建线程,没有核心线程,当60s内这个线程没接收到任务时,它就会被从池中收走。60s内这个线程又接收到新任务时,它就又被重用了。

特征:
1.线程池中线程的数量不固定,最大值是Integer的最大值
2.池中的线程干完活后会等待1分钟(默认的),如果1分钟内又有新任务,这个线程就被调用去干新任务了,如果等了1分钟还没有新任务,这个线程就被从池中清理出去了。
3.当池中没有可用线程时,就创建一个新线程。

创建方式:
1.Executors.newCachedThreadPool();

3.只有一个线程的线程池 newSingleThreadPool

作用:这个线程池中只有1个线程,用无界队列的方式运行。如果这个线程突然挂掉了,线程池会新建一个新的线程顶替它,继续完成任务。

特征:池中只有1个线程,任务要在队列中排队。当需要保证任务执行顺序时,适合用它。

创建方式:
1.Executors.newSingleThreadExecutor();
2.Executors.newSingleThreadExecutor(ThreadFactory threadFactory);

4.延时线程池 newScheduleThreadPool

作用:创建一个线程池,可以让它里面的线程延迟执行,或在规定的时间后执行。

特征:
1.这个池中的线程,可以让它们延迟干活,或规定时间干活(不用来一个任务就去干)
2.线程池中的线程数量固定,即使没有任务,这些线程也保留。(没活也得待在公司)

创建方法:
1.Executors.newScheduledThreadPool(int corePoolSize);
2.Executors.newScheduledThreadPool(int corePoolSize,ThreadFactory threadFactory);

5. 并行线程池 newWorkStealingPool

作用:jdk1.8提供的线程池,底层使用ForkJoinPool实现,池中有多个任务队列。适用于任务多,可以并发执行的场景。

特征:池中有多个队列

创建方法:
Executors.newWorkStealingPool(int parallelism) 参数的意思是:队列的数量

这个大佬总结的很好:
https://blog.csdn.net/u012253957/article/details/102966939

Java基础知识:线程池的种类(5种)相关推荐

  1. Java基础之线程池

    Java基础之线程池 转载于:https://www.cnblogs.com/daierge/p/10954228.html

  2. Java基础:线程池

    第一章 等待唤醒机制 1.1 线程间通信 概念:多个线程在处理同一个资源,但是处理的动作(线程的任务)却不相同. 比如:线程A用来生成包子的,线程B用来吃包子的,包子可以理解为同一资源,线程A与线程B ...

  3. 计算机语言之java基础知识一

    在家已经待了一个多星期了,最近学到的东西一直没有梳理,这次变梳理边分享出来,说是分享其实就是搬运一下. Java 基础知识 基本数据类型 问:7 种基本数据类型:整型.浮点型.布尔型.字符型? 答:四 ...

  4. java线程概念_《Java基础知识》Java线程的概念

    按照规划,从本篇开始我们开启『并发』系列内容的总结,从本篇的线程开始,到线程池,到几种并发集合源码的分析,我们一点点来,希望你也有耐心,因为并发这块知识是你职业生涯始终绕不过的坎,任何一个项目都或多或 ...

  5. java——自己实现基础的线程池及带有任务数过多拒绝策略、线程池销毁、自动扩充线程数量及闲时自动回收线程等操作的改进版线程池

    1. 实现第一版基础的线程池 1.1 首先我们定义一个线程池类ThreadPool,然后线程池有一个容器存放我们创建的线程,另一个容器则是存放当前线程池需要处理的任务队列,线程容器用ArrayList ...

  6. Java并发基础(六) - 线程池

    Java并发基础(六) - 线程池 1. 概述 这里讲一下Java并发编程的线程池的原理及其实现 2. 线程池的基本用法 2.1 线程池的处理流程图 该图来自<Java并发编程的艺术>: ...

  7. Java线程池系列--线程池的种类(Executors的用法)

    原文网址:Java线程池系列--线程池的种类(Executors的用法)_IT利刃出鞘的博客-CSDN博客 简介 说明 线程池是Java多线程常用的技术,本文介绍线程池的种类,用示例介绍其用法. 相关 ...

  8. Java基础知识运用,用对象,线程,Java窗口画出太阳系

    一个项目让你搞懂对象:Java基础知识运用,用对象,线程,GUI画出太阳系 一.需求分析: 用java基础知识画出太阳系八大行星的运行轨迹图,要求:运行轨迹图是动态图片,画出运行轨迹,画出地月系(不需 ...

  9. java 中线程池的种类,原理以及源码解析(1)

    java 中的线程池创建都是Executors 类中提供的方法,并且方法返回线程池对象. Executors 源码: // // Source code recreated from a .class ...

  10. Java 通过Executors创建线程池的种类

    java通过Executors可以创建四种线程池: newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需求,可灵活回收空闲线程,若无可回收,则新建线程. newFix ...

最新文章

  1. MySQL中truncate误操作后的数据恢复案例
  2. Linux Malloc分析-从用户空间到内核空间
  3. IOS-awakeFromNib和viewDidLoad
  4. Ids4 认证保护 API 方案更新
  5. 人脸检测,微软提出用RNN代替CNN
  6. php的关系数据库,php – 从关系数据库到非关系数据库的数据规范化的最佳实践...
  7. JS遮罩效果 (很强)
  8. 多变量微积分笔记19——直角坐标系和柱坐标系下的三重积分
  9. 科学计算机弧度怎么读,角度怎么换算(角度换算弧度计算器)
  10. 按键精灵_汉字转拼音
  11. python广州地图_广东省客户数量地图展示,如何通过python实现?
  12. mysql hugepage_huge page 能给MySQL 带来性能提升吗?
  13. 在线banner制作网站
  14. 购买阿里云服务器发布项目后外网无法访问的解决办法
  15. 2015中国国内元器件分销商10亿俱乐部20强榜单
  16. 一个资源丰富的在线小程序社区推荐
  17. 报错“/sbin/ldconfig.real: /usr/lib/x86_64-linux-gnu/libopencv_video.so.3.2 is not a symbolic link“
  18. IT工科女硕士-求职总结帖
  19. 小飞升值记——(21)
  20. 仓库建设细节及注意事项

热门文章

  1. 悔不当初:没人能随随便便成功
  2. sql实现学生信息查询
  3. Java篇 - 最全BigInteger和BigDecimal实战
  4. ORACLE-使用DBCA创建数据库
  5. MATLAB之最优路径的查找
  6. TeraTerm的设定
  7. cholesky 分解加速求解线性方程组
  8. PVLAN 技术介绍
  9. PDF合并、分割、转换等功能—免费工具
  10. Altium Designer 批量修改器件名