1

基础
线程池的7个参数,核心线程数,最大线程数,worker生存时间,时间单位,阻塞队列,ThreadFactory,RejectExecutionHandler拒绝策略

阻塞队列可以是ArrayBlockingQueue和LinkedBlockQueue,LinkedBlockQueue可以是无界队列,如果是无界队列,那么非核心线程不会创建

自定ThreadFactory可以设置友好的线程名字,出现异常时候,可以根据线程的名字来排查

拒绝策略默认有四种,AbortPolicy抛异常,DiscardPolicy丢弃,DiscardOldPolicy丢弃最老的,CallerRunners主线程执行。这几种拒绝策略都不是特别友好,一般会自定义拒绝策略,当拒绝的时候可以持久化或发送到消息队列

线程池的执行过程,
1、小于核心线程数,创建核心Worker,调用runWorker执行任务,runWorker中死循环调用getTask从阻塞队列中获取任务。Worker内部持有一个Thread属性,本身是一个Runnable
2、超过核心线程数,尝试添加到阻塞队列,此处如果队列是无解的,那么添加到阻塞队列一定成功
3、如果添加阻塞队列失败,创建非核心Worker,调用runWorker执行任务
4、如果超过了最大worker数量,会执行策略。
5、当线程池中没有任务的时候,就是getTask调用workQueue.poll(time)超时,如果worker数量大于核心线程数,那么会回收该worker,如果允许回收核心的worker,那么直接回收。在此处可以看出来,线程的生存时间超时是利用了阻塞队列中的阻塞时间,如果超过了阻塞时间那么就会回收
如果是Callable任务,那么会封装为FutureTask

执行过程

image.png


一只鱼
49 声望1 粉丝

« 上一篇
Future
下一篇 »
内存语义