Java线程池
2023-02-22 20:06:19 0 举报
Java线程池
作者其他创作
大纲/内容
9
是
AbortPolicy,表示无法处理新任务时抛出异常。以下是JDK1.5提供的四种策略。1. AbortPolicy:直接抛出异常。2. CallerRunsPolicy:只用调用者所在线程来运行任务。3. DiscardOldestPolicy:丢弃队列里最近的一个任务,并执行当前任务。4. DiscardPolicy:不处理,丢弃掉。当然也可以根据应用场景需要来实现RejectedExecutionHandler接口自定义策略。如记录日志或持久化不能处理的任务。
出队
takeLock锁
阻塞队列
尾部入队
入队
否
workQueue:用于保存等待执行的任务的阻塞队列。可以选择以下几个阻塞队列。1. ArrayBlockingQueue:是一个基于数组结构的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。2. LinkedBlockingQueue:一个基于链表结构的阻塞队列,此队列按FIFO (先进先出) 排序元素,吞吐量通常要高于ArrayBlockingQueue。静态工厂方法Executors.newFixedThreadPool()使用了这个队列。3. SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQueue,静态工厂方法Executors.newCachedThreadPool使用了这个队列。4. PriorityBlockingQueue:一个具有优先级得无限阻塞队列。
数组存取同一把锁
队列不空
阻塞队列 BlockingQueue
lock锁
出队取根节点后去除根节点并重新调整堆
notEmpty唤醒
notEmpty等待
原队列已满
原队列为空
10
创建线程执行任务
8
5
2
线程池
提交任务
链表存取不同的锁
线程池处理流程
ArrayBlockingQueue
逻辑结构 【最小堆】
notFull唤醒
头部出队
队列已满
PriorityBlockingQueue
将任务存储在队列
putLock锁
notFull等待
物理结构
线程池是否已满
LinkedBlockingQueue
等待队列是否已满
队列未满
使用者
扩容
队列为空
核心线程池是否已满
tryGrow方法释放独占锁lock通过自旋CAS乐观锁提高效率
按照策略处理无法执行的任务
1
收藏
收藏
0 条评论
回复 删除
下一页