1. 为什么要是用线程池

  • 反复创建线程开销大,用线程池可以让一部分线程一直处于运行状态,避免反复创建
  • 过多的线程池会占用太多的内存,用线程池可以用少量的线程,避免了占用太多内存的问题

2. 使用线程池的好处

  • 合理的使用cpu和内存资源
  • 加快了响应速度,不需要反复的创建和消费
  • 使用线程池,可以统一管理线程

3. 线程池的使用场合

  • 服务器接收大量的请求,使用线程池是非常合适的
  • 实际开发中,如果遇到需要创建线程太多的逻辑,
  • 可以使用线程池

想要了解线程池,其创建线程池的参数是必须要了解,线程池类: ThreadPoolExecutor

ThreadPoolExecutor 类的构造方法

corePoolSize

核心线程数量

线程池在初始化完成以后,默认里面是没有线程的。在任务来的时候才会创建新的线程。当线程执行完成以后,线程池会保留 corePoolSize 数量的线程。

maximumPoolSize

最大的线程数量

当任务数量大于 corePoolSize 时候并且等待队列已满,还有当前线程数量没有超过 maximumPoolSize设置的数值,会再创建新的线程来执行任务,任务完成以后,只会保留核心数量的线程,其它的线程超过空闲时间就会销毁。

keepAliveTime

存活时长

存活时长

unit

存活时长的时间单位

存活时长的时间单位

workQueue

任务存储队列

1.直接交换:SynchronousQueue 该队列不能缓冲任务

2.无界队列:LinkedBlockingQueue该队列没有容量上限

3.有界队列:ArrayBlockingQueue 该队列有大小

threadFactory

线程工厂

线程工厂

创建新的线程时所用,有默认的线程工厂

handler

拒绝策略

拒绝策略

当线程池无法接受新任务时候的拒绝策略

workQueue 任务存储队列
  • LinkedBlockingQueue 无界队列: 默认大小 int 最大值,因此可能会耗尽系统内存,引起OOM,非常危险。
  • SynchronousQueue 直接交换队列 : 没有容量,不会保存,直接创建新的线程,因此需要设置很大的线程池数。否则容易执行拒绝策略,也很危险。
  • ArrayBlockingQueue  有界队列:如果core满了,则存储在队列中,如果core满了且队列满了,则创建线程,直到maximumPoolSize 到了,如果队列满了且最大线程数已经到了,则执行拒绝策略。

handler 拒绝策略

  • AbortPolicy :直接抛出异常,阻止系统正常工作.
  • CallerRunsPolicy : 只要线程池未关闭,该策略直接在调用者线程中,运行当前被丢弃的任务。显然这样做不会真的丢弃任务,但是,任务提交线程的性能极有可能会急剧下降。
  • DiscardOldestPolicy: 该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务.
  • DiscardPolicy: 该策略默默地丢弃无法处理的任务,不予任何处理,如果允许任务丢失,我觉得这是最好的方案.

实现 RejectedExecutionHandler 接口,并重写 rejectedExecution 方法可自定义拒绝策略

Executors工具类中提供了几种常用的线程池
        // 创建单列线程的线程池ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();// 创建固定大小的线程池ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);// 创建带缓存的线程池ExecutorService cachedThreadPool = Executors.newCachedThreadPool();// 创建可以用时间调度的线程池ScheduledExecutorService scheduledService = Executors.newScheduledThreadPool(1);

1. 固定线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
该方法返回一个固定线程数量的线程池。该线程池中的线程数量始终不变。当有一个新的任务提交时,线程池中若有空闲线程,则立即执行,若没有,则新的任务会被暂存在一个任务队列(默认无界队列 int 最大数)中,待有线程空闲时,便处理在任务队列中的任务。

2. 单例线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
该方法返回一个只有一个线程的线程池。若多余一个任务被提交到该线程池,任务会被保存在一个任务队列(默认无界队列 int 最大数)中,待线程空闲,按先入先出的顺序执行队列中的任务。

3. 缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
该方法返回一个可根据实际情况调整线程数量的线程池,线程池的线程数量不确定,但若有空闲线程可以复用,则会优先使用可复用的线程,所有线程均在工作,如果有新的任务提交,则会创建新的线程处理任务。所有线程在当前任务执行完毕后,将返回线程池进行复用。

4. 任务调用线程池
ExecutorService scheduledService = Executors.newScheduledThreadPool(2);
该方法也返回一个 ScheduledThreadPoolExecutor 对象,该线程池可以指定线程数量。

java 线程池学习小记相关推荐

  1. Java线程池(1) - 问题驱动“Java线程池”学习

    下面是几个Java线程池的问题,大家尝试回答一下: 1 使用线程池比手动创建线程好在哪里? 2 线程池的各个参数的含义? 3 线程池有哪 4 种拒绝策略? 4 有哪 6 种常见的线程池?什么是 Jav ...

  2. Java线程池 - 问题驱动学习

    Java线程池 本章内容: 1.问题驱动"Java线程池"学习 2.线程池的功能需求 3.实现Thread Pool模式 4.JUC Executors源码分析

  3. JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue .

    2019独角兽企业重金招聘Python工程师标准>>> 从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.Thread ...

  4. 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue

    从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构 ...

  5. java线程池使用详解ThreadPoolExecutor使用示例

    一 使用线程池的好处 二 Executor 框架 2.1 简介 2.2 Executor 框架结构(主要由三大部分组成) 1) 任务(Runnable /Callable) 2) 任务的执行(Exec ...

  6. Java线程池详解学习:ThreadPoolExecutor

    Java线程池详解学习:ThreadPoolExecutor Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) - zhangpeterx的博客 在源码的目录java/util/ ...

  7. Java 线程池详解学习:FixedThreadPool,CachedThreadPool,ScheduledThreadPool...

    Java常用的线程池有FixedThreadPool和CachedThreadPool,我们可以通过查看他们的源码来进行学习. Java的源码下载参考这篇文章:Java源码下载和阅读(JDK1.8) ...

  8. 基于Java线程池读取数据库中数据(学习+运用)

    基于Java线程池读取数据库中数据(学习+运用) 以下是学习内容 Main.java import java.util.concurrent.ArrayBlockingQueue; import ja ...

  9. 四种Java线程池用法解析

    四种Java线程池用法解析 本文为大家分析四种Java线程池用法,供大家参考,具体内容如下 http://www.jb51.net/article/81843.htm 1.new Thread的弊端 ...

最新文章

  1. 科研文献|粪便污染可以解释人为影响环境中抗生素耐药基因丰度
  2. 用Java Instrumentation 在类加载时添加记录
  3. 关于YOLO算法的备忘
  4. sqlserve 热备用状态更新_核心交换机的链路聚合、冗余、堆叠、热备份
  5. 遍历一个数据去掉最后一个元素的样式
  6. 计算机显卡960,2015显卡开年之作!NVIDIA GTX960首测
  7. ORACLE获取某个时间段之间的月份列表和日期列表
  8. 版本代码详解:Alpha,Beta,Rc,GA,RTM,OEM等简称都代码什么意义
  9. 搜索最好的Android 代码
  10. Photoshop 2021安装教程附PS安装包下载
  11. 图像检索简介--笔记
  12. win10计算机网络共享设置密码,win10局域网设置密码如何设置_win10局域网怎么设置访问密码-win7之家...
  13. xingtai -斗罗大陆图片下载
  14. 字体加粗造成文字抖动
  15. android回收activity,Android系统回收activity行为
  16. Sentinel流控效果—Warm Up
  17. 简单工厂、工厂方法、抽象工厂、抽象工厂加简单工厂
  18. Java开发入门教程!java开发架构师职责
  19. Revit“原点”、“中心”、“测量点”在哪里?
  20. 坐标系统和投影变换基础知识及其在ArcGIS桌面产品中的应用(二)

热门文章

  1. java org.jb2011报错_Java中getResourceAsStream()用法总结(转)
  2. mysql商品管理系统总结_Mysql管理总结
  3. python遍历循环选择题_19道Python循环遍历,while,for语句测试题,网上看到的题目,自己不看答案全部做了一次,总共3个小时左右...
  4. 渝北统景碑口规划开发_渝北将又添“大水缸”御临河上将形成2.9平方公里人工湖面...
  5. C语言如何编写游戏界面,「分享」C语言如何编写图形界面
  6. 2011计算机考研分数线,2011年计算机考研各院校分数线 说明
  7. html主动发起重新布局,重启连不上网
  8. 计算机一级判断题2016,2016年12月计算机一级考试WPS判断题及答案
  9. java 读取url https_如何获取URL链接是http还是https
  10. 软件测试基础--笔记6