线程池

线程池
1.线程池的主要工作是什么?
线程池做的工作主要是控制运行的线程的数量。处理工程中将任务放入队列,然后在线程创建后启动这些任务,如果线程数量超过了最大数量超出数量的线程排队等待,等其他线程执行完毕,再从队列中取出来任务执行。
2线程池主要特点:线程复用,控制最大并发数,管理线程。

第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
第三:提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。
3.线程池的七大参数:
int corePoolSize,线程池中常驻核心线程数
int maximumPoolSize,线程池中能够容纳的最大线程数,此值必须大于等于1
long keepAliveTime, 多余的空闲线程的存活时间,当前线程池数量超过corePoolSize时, 当空闲时间达到keepAliveTime值时,多余的线程将被销毁直到剩下corePoolSize为止
TimeUnit unit, keepAliveTime的单位
BlockingQueue workQueue):任务队列,被提交但尚未执行的任务
ThreadFactory threadFactory,表示生产线程池中工作线程的线程工厂,用于创建线程,一般为默认的即可
RejectedExecutionHandler handler:拒绝策略,表示当队列满了并且工作线程大于等于线程池
4.拒绝策略
(1).ThreadPoolExecutor.AbortPolicy() 直接抛出异常
(2).ThreadPoolExecutor.CallerRunsPolicy() 将超出的返回给调用者,不抛出异常。
(3).ThreadPoolExecutor.DiscardOldestPolicy() 丢弃等待时间最久的任务,然后将最新的任务尝试再次提交,不抛出异常。
(4).ThreadPoolExecutor.DiscardPolicy() 直接丢弃超出的任务,不抛出异常。如果场景允许丢弃任务,则这是最优选择
5.如何配置线程池的最佳数量
(1).CPU密集型是该任务需要大量的计算,而没有阻塞,CPU一直再高速运转
计算公式:cpu核数+1个线程的线程池,尽量避免上下文切换
(2).IO密集型的任务并不是一直再执行任务,则应配置尽可能多的线程。具有大量阻塞。
计算公式:CPU核心数*2
CPU/(1-阻塞系数) 阻塞系数一般在0.8-0.9
6.手写线程池
ExecutorService executorService=new ThreadPoolExecutor(2,5,2, TimeUnit.SECONDS,new LinkedBlockingQueue(5),
Executors.defaultThreadFactory(),new ThreadPoolExecutor.DiscardPolicy());

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值