写这篇文章主要还是为了强迫自己把学习Java源代码的一些要点记录下来。
构造函数:
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
参数含义:
corePoolSize 线程池里面保存的最多可以闲置的线程数量。
allowCoreThreadTimeOut被调用后,则没有线程能够在timeout后还保存在线程池里
maximumPoolSize 线程池里面保存最多的线程数量
keepAliveTime,
unit 当线程池里面保存的线程数量大于corePoolSize后,闲置的线程等待最大指定的时间(然后被关闭)
workQueue 用来保存被提交的任务
threadFactory 用来创建新线程的factory
handler 当所有线程都在执行任务并且workQueue已经满了,handler处理新提交进来的任务
JDK 自带的 RejectedExecutionHandler 实现有4个:AbortPolicy, CallerRunsPolicy, DiscardOldestPolicy, DiscardPolicy。
AbortPolicy 是默认策略直接 throw RejectedExecutionException
CallerRunsPolicy 当Executor没有被关闭,则直接由提交任务的线程直接运行
DiscardOldestPolicy 当Executor没有被关闭,从workQueue里面删除等待最久的一个任务,然后再调用execute
DiscardPolicy 当前任务被直接抛弃
ThreadPoolExecutor 的 AtomicInteger ctl 属性很有意思,是一个32位的 AtomicInteger 。在最高3位存储了当前 ThreadPoolExecutor 的状态,后面29位用于存储当前线程的数量。所以在很多 ThreadPoolExecutor 的方法调用里面,CAS操作要求状态和线程的数量都是所期望的,才能进行后面的操作。
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 00000000000000000000000000000000
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY = (1 << COUNT_BITS) - 1; // 00011111111111111111111111111111
// runState is stored in the high-order bits
private static final int RUNNING = -1 << COUNT_BITS; // 11100000000000000000000000000000
private static final int SHUTDOWN = 0 << COUNT_BITS; // 00000000000000000000000000000000
private static final int STOP = 1 << COUNT_BITS; // 00100000000000000000000000000000
private static final int TIDYING = 2 << COUNT_BITS; // 01000000000000000000000000000000
private static final int TERMINATED = 3 << COUNT_BITS; // 01000000000000000000000000000000
// 获取当前的状态
private static int runStateOf(int c) {
return c & ~CAPACITY;
}
// 获取当前的线程数量
private static int workerCountOf(int c) {
return c & CAPACITY;
}
// 合并状态和线程数量
private static int ctlOf(int rs, int wc) {
return rs | wc;
}
其他属性:
volatile RejectedExecutionHandler handler
BlockingQueue<Runnable> workQueue // 用来存储提交的任务。一般是使用 LinkedBlockingQueued
HashSet<Worker> workers // 工作线程抽象成了 Worker
long completedTaskCount // 完成任务的数量
ReentrantLock mainLock = new ReentrantLock() // 在需要访问 workers,completedTaskCount 时候需要先获取 mainLock。包括在添加 Worker,中断线程,关闭线程池等时候
Condition termination = mainLock.newCondition() // 用来等待线程池
volatile int corePoolSize // 核心线程的最大数量
volatile int maximumPoolSize // 所有线程的最大数量
volatile long keepAliveTime // 非核心线程的超时时间
volatile boolean allowCoreThreadTimeOut // 是否让核心线程也超时。默认为 false,即核心线程永远存活,直到关闭线程池。如果调用void allowCoreThreadTimeOut(boolean value)设置为 true, 即核心线程 idle 超过 keepAliveTime 时间以后,也会被关闭
volatile ThreadFactory threadFactory // 用来创建线程的工厂
Java ThreadPoolExecutor 学习笔记(二)
Java ThreadPoolExecutor 学习笔记(三)
分享到:
相关推荐
Java专题学习笔记主要涵盖了Java语言的核心概念、进阶特性以及实际应用中的问题解析。这份笔记是结合了讲师的讲解和个人的整理,旨在为热爱Java编程的朋友们提供丰富的学习资源。以下将详细介绍其中可能包含的知识点...
【良葛格Java学习笔记】 本笔记主要涵盖了Java编程语言的核心概念和技术,旨在帮助初学者以及有一定基础的开发者深入理解并掌握Java。Java作为一种广泛应用于企业级应用开发、移动开发(尤其是Android)以及大数据...
Java学习笔记源码MD.rar是一个压缩包,其中包含了一系列关于Java编程语言的学习资料,特别是针对JVM(Java虚拟机),Spring框架以及Java多线程等内容的深入探讨。这些主题是Java开发中的核心部分,对于任何想要提升...
Java面试题及学习笔记概述 Java作为一种广泛应用的编程语言,其面试题库广泛且深入,涵盖了从基础语法到高级特性的各个层面。本篇将基于常见的Java面试问题,结合学习笔记,深入探讨Java的核心概念和技术。 一、...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
这篇学习笔记将深入探讨Java多线程的核心概念、实现方式以及相关工具的使用。 一、多线程基础 1. 线程与进程:在操作系统中,进程是资源分配的基本单位,而线程是程序执行的基本单位。每个进程至少有一个主线程,...
Java公司培训经典学习笔记是针对Java编程语言进行深入学习的一份宝贵资料,涵盖了从基础到高级的诸多知识点,旨在帮助开发者提升技能,适应企业级项目开发的需求。以下将详细阐述这些笔记中的关键点: 1. **Java...
Java JDK1.6学习笔记是一份详实的资料,涵盖了Java开发工具集(JDK)1.6版本的核心概念和技术。这份笔记对于Java初学者以及有一定经验的开发者来说都是一份宝贵的参考资料,它可能包含了从基础语法到高级特性的讲解...
Java的ExecutorService接口提供了线程池服务,其中包括ThreadPoolExecutor和ScheduledThreadPoolExecutor等实现。 7. **Volatile**: Volatile关键字保证了变量的可见性,但不保证原子性。当多个线程访问volatile...
这篇“java学习笔记”可能包含了从基础到进阶的各种Java编程概念和技术。以下是对这些笔记可能涵盖的一些关键知识点的详细说明: 1. **Java基础知识**: - **语法**:包括变量声明、数据类型(如整型、浮点型、...
本篇学习笔记将深入解析Java线程池的框架、结构、原理以及相关源码,帮助读者全面理解线程池的工作机制。 1. 线程池模块结构 线程池框架分为多层结构,其中包括核心实现类、辅助类和接口等组件。例如,`sun.nio.ch....
这份学习笔记旨在帮助读者深入理解和掌握Java编程技术,以下是笔记中的主要知识点: 1. **Java基础** - **变量与数据类型**:Java有基本数据类型(如int、char、boolean等)和引用数据类型(类、接口、数组)。...
在这个阶段的学习中,尚硅谷提供了2023年的学习笔记和面试题,帮助你提升Java技能并为求职做好准备。 首先,多线程是Java的一个关键特性,允许程序同时执行多个任务。理解线程的创建(通过Thread类或实现Runnable...
这份达内的Java学习笔记详尽地涵盖了这些核心知识点,对于渴望在Java领域深化技能的开发者来说是一份宝贵的资源。通过系统学习和实践,可以全面提升Java编程能力,为开发高质量的应用打下坚实基础。
Java学习笔记基础与框架 Java是一种广泛使用的面向对象的编程语言,它的设计目标是具有简单性、面向对象、健壮性、安全性、可移植性等特点。这份“java学习笔记基础和框架”涵盖了从Java的基础概念到高级特性的全...
张龙老师的JAVA圣思园笔记深入浅出地涵盖了JAVA-SE的基础知识点,帮助学习者构建扎实的Java编程基础。 1. **IO(输入/输出)**: Java IO是处理数据输入和输出的重要模块,包括文件操作、流处理等。笔记中可能讲解...
### Java分布式应用学习笔记07线程池应用 在深入探讨Java分布式应用中线程池的应用之前,我们先来理解一下线程池的基本概念及其在并发编程中的重要性。线程池是Java并发编程的核心技术之一,它通过复用一组预创建的...
以上只是Java学习笔记中可能涉及的部分知识点,实际上,完整的笔记还会包含更深入的Java特性,如注解、模块系统、JDBC数据库访问、Spring框架等内容,以及实际项目开发中的最佳实践。这份笔记是初级Java程序员系统...
这份"JAVA学习笔记.doc"文档应该涵盖了以上各个方面的详细内容,通过深入学习和实践,你将能够熟练掌握Java编程,成为一名合格的Java开发者。记得理论结合实践,编写代码是提升技能的最佳途径。
这份"java笔记"涵盖了从基础到进阶的各种Java知识,旨在帮助学习者系统地掌握这门语言。以下是对笔记内容的详细解读: 1. **Java基础知识**: - **语法特性**:Java遵循C++的语法结构,但更加简洁和安全,如自动...