为什么80%的码农都做不了架构师?>>>
1
|
public ThreadPoolExecutor(int corePoolSize,
|
5
|
BlockingQueue<Runnable> workQueue,
|
6
|
ThreadFactory threadFactory,
|
7
|
RejectedExecutionHandler handler)
|
1. 参数解释
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime: 线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue: 线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略,默认值ThreadPoolExecutor.AbortPolicy()
unit可选的参数为java.util.concurrent.TimeUnit中的几个静态属性:NANOSECONDS、MICROSECONDS、MILLISECONDS、SECONDS。
workQueue常用的是:java.util.concurrent.ArrayBlockingQueue
handler有四个选择:
ThreadPoolExecutor.AbortPolicy() 抛出java.util.concurrent.RejectedExecutionException异常
ThreadPoolExecutor.CallerRunsPolicy() 重试添加当前的任务,他会自动重复调用execute()方法
ThreadPoolExecutor.DiscardOldestPolicy() 抛弃旧的任务
ThreadPoolExecutor.DiscardPolicy() 抛弃当前的任务
2. 方法调用
一个任务通过 execute(Runnable)方法被添加到线程池,任务就是一个Runnable类型的对象,任务的执行方法就是 Runnable类型对象的run()方法。
3. 处理机制
当一个任务通过execute(Runnable)方法欲添加到线程池时:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务。
如果此时线程池中的数量等于corePoolSize,但是缓冲队列 workQueue未满,那么任务被放入缓冲队列。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务。
如果此时线程池中的数量大于corePoolSize,缓冲队列workQueue满,并且线程池中的数量等于maximumPoolSize,那么通过 handler所指定的策略来处理此任务。
处理任务的多时:
核心线程corePoolSize、任务队列workQueue、最大线程maximumPoolSize,如果三者都满了,使用handler处理被拒绝的任务。
处理任务的少时:
当线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。这样,线程池可以动态的调整池中的线程数。
4. 创建线程池的一些方法:
01
|
public static ExecutorService newFixedThreadPool(int nThreads) {
|
02
|
return new ThreadPoolExecutor(nThreads,
|
05
|
TimeUnit.MILLISECONDS,
|
06
|
newLinkedBlockingQueue<Runnable>());
|
09
|
public static ExecutorService newCachedThreadPool() {
|
10
|
return new ThreadPoolExecutor(0,
|
14
|
newSynchronousQueue<Runnable>());
|
17
|
public static ExecutorService newSingleThreadExecutor() {
|
18
|
return new FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1,
|
21
|
TimeUnit.MILLISECONDS,
|
22
|
newLinkedBlockingQueue<Runnable>()));
|
转载于:https://my.oschina.net/004/blog/211994
Java多线程:类ThreadPoolExecutor详解相关推荐
- JAVA 多线程并发超详解
JAVA 多线程并发超详解(未完,下一篇文章还有) 1. JAVA 多线程并发 1.1.1. JAVA 并发知识库 1.1.2. JAVA 线程实现/创建方式 1.1.2.1. 继承 Thread 类 ...
- Java——多线程之方法详解
Java多线程系列文章是Java多线程的详解介绍,对多线程还不熟悉的同学可以先去看一下我的这篇博客Java基础系列3:多线程超详细总结,这篇博客从宏观层面介绍了多线程的整体概况,接下来的几篇文章是对多 ...
- Java多线程(超详解)
目录 1. 线程简介 1.1 程序 1.2 进程 1.3 线程 1.4 多线程 1.5 普通方法调用和多线程 2. 线程创建 2.1 继承Thread类 2.2 实现Runnable接口 2.3 实现 ...
- java 多线程同步_详解Java多线程编程中的线程同步方法
1.多线程的同步: 1.1.同步机制:在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直 ...
- Java常用类StringBuffer详解
内容多为最近学习的自我总结,可能有些地方写的不严谨,甚至会有错误的地方,仅供参考,如发现错误敬请指出,谢谢! 灰色字体为补充扩展内容,多为帮助自己理解. StringBuffer概述: 线程安全的可变 ...
- java 多线程基础 万字详解(通俗易懂)
目录 一.前言 二.定义 1.进程 : 2.线程 : 3.单线程与多线程 : 4.并发与并行 : 三.线程的创建 1.创建线程的两种基本方式 : 1° 继承Thread类,并重写run方法 1.5° ...
- (五)Java工具类ArrayUtils详解
说明:ArrayUtils工具类在标准的应用程序中是不可以被实例化的: 参考:[参考地址](http://commons.apache.org/proper/commons-lang/javadoc ...
- java bufferedreader类_详解java中的BufferedReader类
Java中BufferedReader类 构造方法: 一:public BufferedReader(Reader in,int sz) 1.用指定大小输入缓冲区的缓冲字符输入流: 2.in 一个 R ...
- java多线程:ThreadLocal详解
场景: 登录用户的信息保存与获取问题. 在常规的系统设计中,后端系统通常会有一个很长的调用链路(Controller->Service->Dao). 通常用户在登陆之后,用户信息会保存在s ...
最新文章
- Python模块与类
- Leetcode: Populating Next Right Pointers in Each Node II
- 【floyd存字典序路径】【HDU1385】【Minimum Transport Cost】
- Apache、tomcat、Nginx常用配置合集
- C语言中的“三字母词”坑了工程师
- php模块安装 pdo_mysql_关于php插件pdo_mysql的安装
- Oracle集合查询
- linux内核 默认路由表,[Linux] linux路由表-Go语言中文社区
- 这是300年后的人类生活!你相信吗?
- 使用 Sublime 比较文档差异
- MWC-电机、电池螺旋桨搭配
- linux下的系统垃圾清理
- Spring漫画学习笔记(一) 什么是BeanDefinition
- 基于人脸识别的考勤系统:Python3 + Qt5 + OpenCV3 + FaceNet + MySQL
- ABM410-ASEMI贴片整流桥ABM410
- C++ Reference: Standard C++ Library reference: C Library: cstdio: FILE
- java验证码验证码_Java登录页面实时验证用户名密码和动态验证码
- [2017校招]大可打卡1
- 小波分析:db小波的分解与重构
- VS2017中文乱码
热门文章
- 电动汽车:新一轮三年十倍,“补贴”结束“高端”开启
- 【未来研究】城市云脑是互联网云脑的节点,城市云脑之间如何互补与支撑
- 世界首富贝佐斯将“退休”
- 买房必看!又一程序员自编“购房宝典”火爆 GitHub
- 童心制物(Makeblock)受邀参加2020年韩国机器人世界展览会,倡导以先进的STEAM教育培养未来复合型人才
- 如果宁静是 Oracle,万茜、张雨绮、黄圣依是什么?
- 关于redis的几件小事(三)redis的数据类型与使用场景
- 基于htmlparser实现网页内容解析
- Sqlserver 查询 临时字段
- c++版a+b问题的各种无聊做法