线程池
2022-03-23 23:36:40 1 举报
线程池的工作原理
作者其他创作
大纲/内容
TERMINATED终结
是否周期性,就是判断period是否为0。
等待唤醒机制可以基于wait和notify方法来实现,在一个线程内调用该线程锁对象的wait方法,线程将进入等待队列进行等待直到被唤醒。LockSupport是JDK中用来实现线程阻塞和唤醒的工具,线程调用park则等待“许可”,调用unpark则为指定线程提供“许可”
核心线程corePoolSize
阻塞队列workQueue
shutdown()
BLOCKED阻塞
线程池里的参数
WAITING等待
DiscardPolicy 直接丢弃
添加到workerSet
检查任务是否可以被执行。
运行成功
唤醒
execute
RUNNABLE运行
ScheduledThreadPoolExecutor定时线程池
构造Worker时的firstTask不为空
TIMED_WAITING超时等待
ScheduledFutureTask#run
3.当阻塞队列已满,则创建临时线程放入最大线程池里
Task
ThreadPoolExecutor默认线程池
本质都是调用
临时线程
super.getQueue().add(task)
小于核心线程数
STOP
DiscardOldestPolicy 丢去阻塞队列钟等待最长的线程
NEW 新建
是
terminated()
join方法等待调用join方法的线程结束之后,程序再继续执行,一般用于等待异步线程执行完结果之后才能继续运行的场景。
线程池工作线程数为0
无任务超时,任何任务为null
READY就绪
handler
系统调度yield()
new Thread()创建线程
不接收新任务,不处理已添加的任务,并且会中断正在处理的任务
获取队列任务,无限循环获取
setNextRunTime();设置下次运行时间
系统调用
delayedExecute加入队列确保启动
runWorker
LookSupport.UNPARK()Object.notify()Object.notifyAll()
拒绝策略
拒绝策略handler
线程工厂threadFactory
无任务阻塞
font color=\"#f44336\
thread.start()
是否允许isShutdown()
priorityBlockingQuene具有优先级的无界阻塞队列
具体实现
Object.wait()Object.join()LookSupport.park()
线程池彻底终止
获取任务结果
线程
sleep方法1.调用 sleep 会让当前线程从 Running 进入TIMED_WAITING状态,不会释放对象锁2.其它线程可以使用 interrupt 方法打断正在睡眠的线程,这时 sleep 方法会抛出 InterruptedException,并且会清除中断标志3.睡眠结束后的线程未必会立刻得到执行4.sleep当传入参数为0时,和yield相同
AbortPolicy直接抛出异常
delayedExecute
SynchronousQuene一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,否则插入操作一直处于阻塞状态,吞吐量通常要高于LinkedBlockingQuene
ThreadPoolExecutor
最大线程数
CallerRunsPolicy由当前线程自己执行本线程
执行完成
ScheduledFutureTask.super.runAndReset()
线程的几种生命状态
否
TIDYING
获取到锁
Thread.sleep()Object.wait(Long)Object.join()LookSupport.parknanosLookSupport.parkUnit
获取我们的Runnable任务无限循环获取任务
更新线程池数量
阻塞
执行任务的run方法
线程的三种创建方式
4.当最大线程也满了之后,则执行拒绝策略
runWorker方法
线程池的状态
加入队列BlockingQueue<Runnable>
ensurePrestart
如果非周期性任务直接调用run运行即可。
2.当核心线程已满,则往阻塞队列推送任务
RUNNING
SHUTDOWN
getTask()从队列拿出任务
1.先在核心线程创建线程
ThreadPoolExecutor#execute执行线程
getTask
队列满了之后
ArrayBlockingQueue基于数组结构的有界阻塞队列,按FIFO排序任务
主流程
最大线程数maximumPoolSize
任务为null
核心线程 corePoolSize
添加到队列
task = getTask()) != null从队列中拿任务
未结束符合条件再次执行
实现Callable
siftUp方法
offer方法
new Thread
ScheduledThreadPoolExecutor(定时线程池)
执行ThreadPoolExecutor#runWorker
实现Runnable
空闲时间keepAliveTime
yield方法1.yield会释放CPU资源,让当前线程从 Running 进入 Runnable状态,让优先级更高(至少是相同)的线程获得执行机会,不会释放对象锁;2.假设当前进程只有main线程,当调用yield之后,main线程会继续运行,因为没有比它优先级更高的线程;3.具体的实现依赖于操作系统的任务调度器
执行Worker#run
有任务成功
执行任务得run方法
能够接收新任务,以及对已添加的任务进行处理
不接收新任务,但能处理已添加的任务
thread
TERMINATED
等待进入sychronized同步块等待获取锁
LinkedBlockingQuene基于链表结构的阻塞队列,按FIFO排序任务,吞吐量通常要高于ArrayBlockingQuene
线程池的执行原理
维护线程的创建和销毁
addWorker
获取方式
实例化
线程的执行状态周期
阻塞队列为空,线程池工作线程数为0
reExecutePeriodic(outerTask);需要重新将任务(outerTask)放到工作队列中。
0 条评论
下一页