首页 > 编程知识 正文

四种线程池,为什么使用线程池

时间:2023-05-06 01:38:26 阅读:151029 作者:2404

图片参考链接: p1

图片参考链接: p2

图片参考链接: p3

当新任务提交到线程池时:

1.线程池判断核心线程池里的核心线程是否都在执行任务。 如果不是,让空闲的核心线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下个流程。

2.线程池判断阻塞队列是否已满。 如果阻塞队列没有满,则将新提交的任务存储在阻塞队列中。如果阻塞队列已满,则进入下个流程。

3.线程池判断线程池里的线程数量是否小于最大线程数量(看线程池是否满了)。 如果小于,则创建一个新的工作线程(非核心线程,并给它设置超时时间,当我们处理完这些任务,无需手动销毁这个非核心线程,超时自动销毁)来执行任务。如果已满,则交给拒绝策略来处理这个任务。

之前学习线程池的工作流程的时候,

自己思考了一个问题,

新加入的任务和阻塞队列的任务抢占线程是公平的还是非公平的?

后来看线程池源码发现在核心线程还没满的时候,是非公平的,

核心线程满了是公平的,个人拙见,有误的话还望大佬指正。

公共void execute (runnable command ) if ) command==null ) throw new NullPointerException ); //null指针异常//* * proceed in3steps : * *1. iffewerthancorepoolsizethreadsarerunning, try to * startanewthreadwiththegivencommandasitsfirst * task.thecalltoaddworkeratomicallychecksrunstateand * worker count, andsopreventsfalsealarmsthatwouldadd * threadswhenitshouldn ' t,byreturningfalse.* *2. ifataskcanbesuccessfullyqueued, thenwestillneed * to double-checkwhetherweshouldhaveaddedathread * (becauseexistingonesdiedsincelastchecking ) or that * thepoolshutdownsinceentryintothismethod.sowe * recheckstateandifnecessaryrollbacktheenqueuingif * stopped, orstartanewthreadiftherearenone.* *3. ifwecannotqueuetask,thenwetrytoaddanew * thread.ifit fails, weknowweareshutdownorsaturated * andsorejectthetask.*//*1.如果运行的线程少于corePoolSize (核心线程数),请将指定的命令与第一个线程和对addWorker的调用通过原子检查运行状态和workerCount来防止意外情况下返回false执行线程的可能性增加。 2 .如果任务已成功排队,则必须再次检查是否需要添加线程。 自上次检查以来,已经死亡。 或者,进入此方法后池已关闭。 因此,如果需要,请重新检查队列的状态,以便在队列停止时回滚队列,或者在没有队列时启动新线程。 3 .如果任务无法排队,请尝试添加新的非核心任务线程。 如果失败了,我们知道已经关闭或饱和了,所以拒绝这个任务(运行拒绝策略) */int c=ctl.get (; //获取当前工作线程数//此段落涉及工作线程(更改核心线程数),因此在工作线程数未达到核心线程数时,将抢占并创建工作线程的情况if (工作线程) //尝试重新获取工作线程的数量((() )/(后面是公平的if(isrunning ) c ) workqueue.offer ) command ) ) /工作线程的死亡和阻塞//在重新检查的同时,工作线程数if (! is running (recheck remove ) command ) /工作线程是否已死亡,以及块队列中是否存在任务reject command ); //运行拒绝策略else if (worker count of (recheck )=0) ) /如果工作线程为0 )池已关闭) addworker ) null,false ); } else if (! 无法添加AddWorker(command,false ) /工作线程reject command ); //运行拒绝策略}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。