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