线程池学习
2023-07-03 11:49:43 9 举报
线程池基础知识
作者其他创作
大纲/内容
<b>线程池的五种状态</b>
RUNNING:<b><font color="#e74f4c">会</font></b>接收新任务并且<font color="#e74f4c"><b>会</b></font>处理队列中的任务
SHUTDOWN:<b><font color="#e74f4c">不会</font></b>接收新任务并且<b><font color="#e74f4c">会</font></b>处理队列中的任务
STOP:<b><font color="#e74f4c">不会</font></b>接收新任务并且不会处理队列中的任务,并且<b><font color="#e74f4c">会中断</font></b>在处理的任务(一个任务能不能被中断,看任务的本身)
TIDYING:所有任务都<b><font color="#e74f4c">终止</font></b>了,线程池中也没有线程了,这样线程池的状态就会转为TIDYING,一旦达到此状态,就会调用线程池的<b><font color="#e74f4c">terminated()</font></b>
TEMINATED:<b><font color="#e74f4c">terminated()</font></b>执行完之后就会转变为<b><font color="#e74f4c">TERMINATED</font></b>
这几种状态不能任意转换,只会有以下几种转换情况:
<b>RUNNING->SHUTDOWN:</b>手动调用<b><font color="#e74f4c">shutdown()</font></b>触发,或者线程池对象GC时会调用<b><font color="#e74f4c">finalize()</font></b>从而调用shutdown()
<b>(RUNNING or SHUTDOWN)->STOP</b>:调用<b><font color="#e74f4c">shutdown()</font></b>方法触发,如果先调用shutdown()紧着调shutdownNow(),就会发生SHUTDOWN->STOP
SHUTDOWN->TIDYING:队列<i><b>为空</b>并且线</i>程池中<b>没有线程</b>时自动转换
STOP->TIDYING:线程池中没有线程时<b>自动</b>转换(队列中可能还有任务)
TIDYING->TERMINATED:<b>terminated()</b>执行完成后就会自动转换
<b>线程发生异常,会被移出线程池吗</b>?<b><font color="#e74f4c">会</font></b>
在线程池的线程执行任务出现异常时,最终执行<b><font color="#e74f4c">processWorkerExit()</font></b>,执行完这个方法后,当前线程会消失,但是processWorkerExit()方法中会额外再<b>新增一个线程</b>,这样就能维持固定的核心线程数。
<b><font color="#e74f4c">线程池中的核心线程数,最大线程数该如何设置</font></b>
线程池负责执行的任务分为三种情况:<b><font color="#e74f4c">理论状态下设置核心线程数</font></b>
<b>CPU密集型任务</b>,比如找出1-1000000的素数
这种任务执行时线程会一直利用cpu,对于这种情况,尽可能<b>避免发生上下文切换</b>,建议核心线程数为cpu的核心数+1
<b><font color="#e74f4c">+1</font></b>是为了防止和某个线程执行过程中中断或者其他异常导致线程阻塞的请求,防止浪费cpu
<b><font color="#e74f4c">获取cpu线程数的API</font></b>:Runtime。getRuntime.availableProcessors()
<b>IO密集型任务</b>:比如文件IO,网络IO
这种任务大部分时间都阻塞在IO上,cpu利用率低,可以设置核心线程数为CPU核心数*2
混合型任务:任务中既有CPU密集型任务,又有IO密集型任务
可以通过公式来计算核心线程数
<b><font color="#e74f4c">线程数 = CPU核心数+(1+线程等待时间/线程运行总时间)</font></b>
<b>线程等待时间</b>:指的是线程没有使用CPU的时间,比如阻塞在IO
<b>线程运行总时间</b>:指的是线程执行完某个任务的<b><font color="#e74f4c">cpu花费总时间</font></b>
0 条评论
下一页