线程池的实现原理(并发编程)

1.线程池比线程好在哪里

1)、每次new Thread,新建对象性能差;
2)、缺乏统一管理,可能导致线程创建过多,死机等。
3)、缺乏更多功能,如:定时执行,定期执行,线程中断等;
4)、自定义线程数量,根据CPU决定。

2.实现线程的复用

run方法结束,线程就结束,线程复用while(true)是前提,通过阻塞队列(BlockingDequen)实现生产者和消费者模型;take,poll等阻塞式获取队列;
阻塞队列有三种:ArrayBlockingQueue;
LinkedBlockingQueue;
SynchronousQueue.

  • 阻塞队列实现生产者、消费者 通过
  • while循环避免线程结束

3.线程池

在这里插入图片描述
线程不够时,会增加临时线程(假如最大线程为6个,核心线程为2个,2个以外的线程都是临时线程),临时线程和核心线程总和不能超过最大线程数;用完之后要回收(判断任务量降低了就行);如果线程池内线程已经达到最大线程数,但是任务量很大,就会采用拒绝策略。
handler:表示当拒绝处理任务时的策略,有以下四种取值:

  • ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
  • ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。

ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)。

  • ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务。

源码分析在这里插入图片描述

addworker

两者等价:

在这里插入图片描述
调用run 方法(因为实现的是Runnable接口)运行;使用poll,设置的超时时间,在设置时间内获取不到,就会停止线程,返回null。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值