Java线程池二:线程池原理

最近精读Netty源码,读到NioEventLoop部分的时候,发现对Java线程&线程池有些概念还有困惑, 所以深入总结一下

Java线程池一:线程基础

为什么需要使用线程池

Java线程映射的是系统内核线程,是稀缺资源,使用线程池主要有以下几点好处

降低资源消耗:重复利用池中线程降低线程的创建和消耗造成的资源消耗。

提高响应速度:任务到达时直接使用池总中空闲的线程,可以不用等待线程创建。

提高线程的可管理性:线程是稀缺资源,不能无限制创建,使用线程池可以统一进行分配、监控、调优。

线程池框架简介

Executor接口:提供execute方法提交任务

ExecutorService接口:提供可以跟踪任务执行结果的 submit方法 & 提供线程池关闭的方法(shutdown, shutdowNow)

AbstractExecutorService抽象类:实现submit方法

ThreadPoolExecutor: 线程池实现类

ScheduleThreadPoolExecutor:可以执行定时任务的线程池

Java线程池二:线程池原理

ThreadPoolExecutor原理 核心参数以及含义

corePoolSize:核心线程池大小

maximumPoolSize: 线程池最大大小

workQueue: 工作队列(任务暂时存放的地方)

RejectedExecutionHandler:拒绝策略(线程池无法执行该任务时的处理策略)

任务提交流程

任务提交过程见下流程图

Java线程池二:线程池原理

线程池的状态

RUNNING:正常的线程池运行状态

SHUTDOWN:调用shutdown方法到该状态,该状态下拒绝提交新任务,但会将已提交的任务的处理完毕

STOP:调用shutdownNow方法到该状态,该状态下拒绝新任务的提交 & 丢弃工作队列中的任务 & 中断正在执行任务的工作线程

TIDYING:工作队列和线程池都为空时自动到该状态

TERMINATED:terminated方法返回之后自动到该状态

Java线程池二:线程池原理

工作队列

核心线程池满时,任务会尝试提交到工作队列,后续工作线程会从工作队列中获取任务执行。

因为涉及到多个线程对工作队列的读写,所以工作队列需要是线程安全的,Java提供了以下几种线程安全的队列(BlockingQueue)

实现类 工作机制
ArrayBlockingQueue   底层实现是数组  
LinkedBlockingDeque   底层实现是链表  
PriorityBlockingQueue   优先队列,本质是个小顶堆  
DelayQueue   延时队列 (优先队列 & 元素实现Delayed接口),ScheduledThreadPoolExecutor实现的关键  
SynchronousQueue   同步队列  
BlockingQueue 多组读写操作API 操作 描述
add/remove   队列已满/队列已空时,抛出异常  
put/take   队列已满/队列已空时,阻塞等待  
offer/poll   队列已满/队列已空时,返回特殊值(false/null)  
offer(time) / poll(time)   超时时间内无法写入或者读取成功,返回特殊值  
拒绝策略

拒绝策略是当线程池满负载时(任务队列已满 & 线程池已满)对新提交任务的处理策略,jdk提供了如下四种实现,其中AbortPolicy是默认实现。

实现类 工作机制
AbortPolicy   抛出RejectedExecutionException异常  
CallerRunsPolicy   调用线程执行该任务  
DiscardOldestPolicy   丢弃工作队列头部任务,再尝试提交该任务  
DiscardPolicy   直接丢弃  

当然我们可以有自定义的实现,比如记录日志、任务实例持久化,同时发送报警到开发人员。

跟踪任务的执行结果

线程池提供了几个submit方法, 调用线程可以根据返回的Future对象获取任务执行结果,那么它的实现原理又是什么呐?

装饰模式对task的run方法进行增强

1.提交任务前,会把task装饰成一个FutureTask对象

public <T> Future<T> submit(Callable<T> task) { if (task == null) throw new NullPointerException(); RunnableFuture<T> ftask = newTaskFor(task); execute(ftask); return ftask; }

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwjyj.html