文档章节

Java线程池ThreadPoolExecutor

JianF
 JianF
发布于 2016/08/09 11:29
字数 924
阅读 32
收藏 1

Java通过Executors提供四种线程池,分别为:

  1. Executors.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
  2. Executors.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
  3. Executors.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
  4. Executors.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

ThreadPoolExecutor中定义了以下几个重要属性:

corePoolSize:池中所保存的线程数,包括空闲线程。 maximumPoolSize:线程池中的最大线程数量。 keepAliveTime : 当线程数大于核心时,此为终止前多余的空闲线程等待新任务的最长时间,超过corePoolSize的空闲线程,在多长时间内会被销毁。 TimeUnit unit:KeepAliveTime 参数的时间单位。 BlockingQueue<Runnable> workQueue:任务队列,被提交的但尚未被执行的任务。 workQueue主要有以下几种实现类型 1). SynchronousQueue:直接提交的队列,该队列没有容量,每一个擦入操作都要对应一个相应的删除操作,反之每个删除操作对应相应的插入操作。 SynchronousQueue不保存任务,它总是将任务提交给线程执行,如果没有空闲的进程,则尝试创建新的进程,如果进程已达到maximumPoolSize设置的最大线程数,则执行拒绝策略 2). ArrayBlockingQueue:有界任务队列,ArrayBlockingQueue的构造函数必须带一个容量参数(例如n),表示该队列的最大容量。当有新任务执行时,这个定义当前线程数为t,构造函数的容量参数为n,当前队列长度为l 1.t<corePoolSize时,创建新的线程之心 2.t>corePoolSize且l<n时,插入到任务队列,等待空闲线程执行 3.t>corePoolSize且l>=n时,创建新的线程执行新任务 4.t>maximumPoolSize时,执行拒绝策略。

3). LinkedBlockingQueue:无界任务队列,当有新任务执行时,如果线程池中线程数小于corePoolSize则创建新的线程,否则进入队列等待。如果没有任务创建速度和处理速度差异很大,无界队列会保持快速增长,直到耗尽系统内存 4). PriorityBlockingQueue: 优先级队列,可以控制任务的执行先后顺序,是一个特殊的无界队列。无论有界的队列无界的队列,都是按照先进先出算法处理任务(絮叨),而该队列破例可以根据任务自身的优先级顺序先后执行。

  1. ThreadFactory threadFactory//线程工厂,用于创建线程,一般默认
  2. RejectedExecutionHandler handler;//拒绝策略,当任务太多来不及处理,如何拒绝任务

JDK内置的拒绝策略如下:   AbortPolity策略:该策略会直接抛出异常,阻止系统正常工作   CallerRunsPolity策略:只要线程为关闭,该策略直接在调用者线程中,运行当前被丢弃的任务 DiscardOledstPolicy策略:该策略将丢弃最老的一个请求,也就是即将被执行的一个任务,并尝试再次提交当前任务。   DiscardPlicy 策略:该策略默默的丢弃无法处理的任务,不予任务处理。 如果以上策略不能满足实际应用需求,可以扩展RejectedExecutionHandler 接口 public interface RejectedExecutionHandler { void rejectedExecution(Runnable r, ThreadPoolExecutor executor); } 其中,r为请求执行的任务,executor为当前线程池。

本文转载自:

共有 人打赏支持
JianF
粉丝 5
博文 24
码字总数 11080
作品 0
通州
其他
Java多线程之线程池(ThreadPoolExecutor)实现原理分析(一)

在上一篇文章Java中实现多线程的3种方法介绍和比较中,我们讲解了Java中实现多线程的3种方法。使用多线程,就必须要考虑使用线程池,今天我们来聊聊线程池的那些事。 注:源码都是基于JDK1....

小怪聊职场
05/14
0
0
Java线程框架_Executor

Executor 框架是 juc 里提供的线程池的实现。前两天看了下 Executor 框架的一些源码,做个简单的总结。 线程池大概的思路是维护一个的线程池用于执行提交的任务。我理解池的技术的主要意义有...

天呀鲁哇
2015/02/05
0
0
ThreadPoolExecutor源码分析及阻塞提交任务方法

ThreadPoolExecutor源码 ThreadPoolExecutor 基本使用参考:ThreadPoolExecutor执行过程分析 线程池状态标志 ctl 保存了线程池的运行状态(runState)和线程池内有效线程数量(workerCount)...

4rnold
06/28
0
0
Java多线程学习(八)线程池与Executor 框架

Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/JavaGuide 历史优质文章推荐: Java并发编程指南专栏 分布式系统的经典基础理...

snailclimb
05/31
0
0
线程池的创建以及CyclicBarrier与CountDownLatch的简单使用

一、线程池的简单创建 (1)、使用Executors进行创建 这两种线程池都是无界队列的线程池,创建比较简单,但可能导致堆积请求处理队列而消耗非常大的内存。 这种可缓存线程池,创建无脑暴力,...

Anur
2017/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

71.告警系统主脚本 配置文件 监控项目

20.20 告警系统主脚本(main.sh) 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本(main.sh): ~1.约定:把以后所有的shell脚本放在/usr/local/sbin下,也方便我们查...

王鑫linux
25分钟前
0
0
装饰者模式

装饰者模式 Q:何为装饰模式? ()地给一个对象添加一些额外的(),并且()时,并不影响原对象。扩展功能来说,装饰器模式相比生成子类更为灵活。 Q:使用场景? 1.想要在不影响其他对象的情况下...

阿元
45分钟前
0
0
GO 切片(slice)相关语法

package mainimport("fmt")func main() {var intArr [5]int = [...]int{1,2,3,4,5} //定义一个数组slice := intArr[2:4] //第二个(包含)下标到第四个下标(不包含)fmt.Println...

汤汤圆圆
47分钟前
0
0
活动招募 HUAWEI HiAI公开课·北京站-如何在4小时把你的APP变身AI应用

人工智能和机器学习是全球关注的新趋势,也是当前最火爆、最流行的话题。当你拿手机用语音助手帮你点外卖,智能推荐帮你把周边美食一网打尽;当你拿起P20拍照时,它将自动识别场景进行最美优...

华为终端开放实验室
今天
1
0
匹配两位小数,js正则

var regex = /^\d*(\.[1-9]|\.\d[1-9])*$/ console.log(1.2,regex.test(1.2)); console.log(0.3,regex.test(0.3)); console.log(1.03,regex.test(1.03)); ......

微信小程序-暗潮
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部