线程池参数详解及其工作原理
线程池的作用及优势
线程池做的工作主要是控制运行的线程的数量,处理过程中将任务加入队列,然后在线程创建后启动这些任务,如果提交的任务超过了线程能执行的最大数量,超出的数量的任务会被提交到一个阻塞队列排队等候,等其他线程执行完毕,再从队列中取出任务来执行.
主要特点为:线程复用:控制最大并发数:管理线程.
第一:降低资源消耗.通过重复利用自己创建的线程降低线程创建和销毁造成的消耗.
第二: 提高响应速度.当任务到达时,任务可以不需要等到线程创建就能立即执行.
第三: 提高线程的可管理性.线程是稀缺资源,如果无限的创建,不仅会消耗资源,还会降低系统的稳定性,使用线程池可以进行统一分配,调优和监控.
线程池的种类
JAVA8中JDK有5种定义好的线程池,分别是:
FixedThreadPool: 创建一个定长线程池,可控制线程的最大并发数,超出的线程会在队列中等待,newFixedThreadPool创建的线程池corePoolSize和MaxmumPoolSize是相等的,它使用的任务队列是LinkedBlockingQueue。
SingleThreadPool:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务都按照指定顺序执行。newSingleThreadExecutor将corePoolSize和MaxmumPoolSize都设置为1,它使用的任务队列是LinkedBlockingQueue。
CacheThreadPool:创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则创建新线程。newCachedThreadPool将corePoolSize设置为0,MaxmumPoolSize设置为Integer.MAX_VALUE,它使用的是SynchronousQUeue,也就是说来了任务就创建线程运行,如果线程空闲超过60秒,就销毁线程。
ScheduledThreadPool:创建一个可以按时间周期执行任务的线程池,使用的任务队列是DelayedWorkQueue。
WorkStealingPool:java8新增,使用目前机器上可以的处理器作为他的并行级别。
以上五种线程池都可以使用Executors来创建:
ps:JDK已经定义好的线程池存在一些问题,例如:
这里指定的任务队列并没有指定其队列容量,直接new会创建一个容量默认的阻塞队列:
队列长度是Integer.MAX_VALUE,这个长度是2^31
由于队列的容量几乎为无界,所以可能会致使任务大量堆积,从而OOM。在使用线程池时,最好使用ThreadPoolExecutor的构造函数来创建。
创建线程池的参数
public ThreadPoolExecutor( //线程池中的常驻核心线程数int corePoolSize,//线程池能够容纳同时执行的最大线程数,此值大于等于1int maximumPoolSize,//多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止long keepAliveTime,//keepAliveTime的单位TimeUnit unit,// 任务队列,被提交但尚未被执行的任务.BlockingQueue<Runnable> workQueue,// 表示生成线程池中工作线程的线程工厂,用户创建新线程,一般用默认即可ThreadFactory threadFactory,// 拒绝策略,表示当线程队列满了并且工作线程大于等于线程池的最大显示 数(maxnumPoolSize)时如何来拒绝.RejectedExecutionHandler handler) {...
总共有7个参数,其中corePoolSize的含义是:1.在创建了线程池后,当有请求任务来之后,就会安排池中的线程去执行请求任务,可以理解为最少存在的线程数。
2.当线程池中的线程数目达到corePoolSize后,就会把到达的任务放入到缓存队列当中。而keepAliveTime是指多余的空闲线程存活时间,当空间时间达到keepAliveTime值时,多余的线程会被销毁直到只剩下corePoolSize个线程为止。
线程池的拒绝策略
线程池拒绝策略也就是上面参数中的RejectedExecutionHandler,线程池有4种拒绝策略,它们都是RejectedExecutionHandler接口的实现类。
AbortPolicy:直接抛出异常。
CallerRunsPolicy:将任务返回给调用者所在线程来运行任务。
DiscardOldestPolicy:丢弃队列里等待最久的一个任务,并执行当前任务。
DiscardPolicy:不处理,丢弃掉。
通过实现RejectedExecutionHandler接口可以自定义拒绝策略,但是拒绝策略是一种处理较为极端的情况的方式,正常情况下尽量通过合理的设计线程池来防止溢出。
线程池的工作流程
画了个简单的示意图:
线程池参数详解及其工作原理相关推荐
- Java线程池参数详解
1:前言 在使用线程池时,为了获取最佳的性能,常常需要手动指定线程池的参数,ThreadPoolExecutor是最常用的线程池执行器,它有四个构造方法,参数最多的构造方法有7个参数,下面将详细介绍这 ...
- 线程池参数详解_java中常见的六种线程池详解
之前我们介绍了线程池的四种拒绝策略,了解了线程池参数的含义,那么今天我们来聊聊Java 中常见的几种线程池,以及在jdk7 加入的 ForkJoin 新型线程池 首先我们列出Java 中的六种线程池如 ...
- 线程池源代码详解,参数详解
线程池源代码详解,参数详解 ThreadPoolExecutor 构造函数源代码 public ThreadPoolExecutor(int corePoolSize, int maximumPool ...
- Java线程池ThreadPool详解
Java线程池ThreadPool详解 1. 线程池概述 1.1 线程池简介 1.2 线程池特点 1.3 线程池解决问题 2. 线程池原理分析 2.1 线程池总体设计 2.6 线程池流转状态 2.2 ...
- async spring 默认线程池_Spring boot注解@Async线程池实例详解
这篇文章主要介绍了Spring boot注解@Async线程池实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从Spring3开始提供了@A ...
- 【转详解步进电机工作原理】
详解步进电机工作原理[转自知乎gk-auto] 步进电机是将电脉冲信号转变为角位移或线位移的开环控制元件.在非超载的情况下,电机的转速.停止的位置只取决于脉冲信号的频率和脉冲数,而不受负载变化的影响, ...
- 详解帧中继工作原理及作用
详解帧中继工作原理及作用 帧中继特点 帧中继工作原理 帧中继的作用 帧中继习题 帧中继(FrameRelay)是一种用于连接计算机系统的面向分组的通信方法.它主要用在公共或专用网上的局域网互联以及广域 ...
- 线程池ThreadPoolExecutor详解(整理详细)
ThreadPoolExecutor 1.什么是线程池? (首先要理解什么是线程) 线程池,thread pool,是一种线程使用模式,线程池维护着多个线程,等待着监督管理者分配可并发执行的任务. 通 ...
- 线程池(ThreadPoolExecutor)详解
线程池 线程池 线程池种类: ThreadPoolExecuter 类关系 结构 自定义线程池参数: 线程池的大小(maximumPoolSize): JDK提供的线程池 singleThreadPo ...
最新文章
- 工作中5个实用的Linux命令
- 2018-01-02 JavaScript实现ZLOGO: 用语法树实现多层循环...
- C++调用matlab编程
- 耗时1周!精选22G超超超适合产品经理的《数据分析》学习资源,抓紧保存!限时2天删除~...
- Unity Standard Assets Example Project
- Win7系统主题路径
- 从你王者荣耀爱玩的英雄类型,我就知道你关注哪些技术领域!
- shell中find详解
- 【POJ 3469】Dual Core CPU【最小割】
- matlab中unique的作用,matlab中的unique函数详解
- C#编写CPU压力测试程序
- Visual C++课程设计选题
- 记一次跟二房东公司(非中介个人房源无中介费)租房的经历
- 隔离DCDC电源模块和非隔离DCDC电源模块不同之处
- [转载]网络数据流的java处理
- 转: 网页设计中的一些色彩搭配技巧
- 大数据技术会偷看我们的邮件?
- jdk小工具jps介绍 - Sky's blog - BlogJava
- Linux配置通过qq邮件服务器发送邮件
- class-validator中文教程