线程池

接口       Executor

               ↑ 继承

接口       ExecutorService           

              ↑实现

抽象类   AbstractExecutorService

              ↑继承

实类       ThreadPoolExecutor                             工具类  Executors

 

ExecutorService pool =  Executors.newSingleThreadExecutor() ;

pool.submit(new Thread());

 

在真正执行时,

1.如果运行的线程数小于corePoolSize, 那么任务将直接操家伙(new Thread)执行。

2.如果运行的线程大于或等于coerPoolSize,那么任务将被添加进队列。

3.如果无法请求添加进入队列,那么就再new Thread,然后执行。

4.如果此时的线程数量已经大于等于maximumPoolSize,此次任务将会被拒绝。

keepAliveTime,这个参数特殊说明一下,就是超过coerPoolSize的线程数,是借来使用的,我们必须还,就在这些线程空闲keepAliveTime以后就还呗。

 

在实际运用中,就得权衡 队列大小和线程池大小。

直接提交maximumPoolSizes 无界,就不会将任务添加进队列

无界队列LinkedBlockingQueue,此时,任务可以无限添加进队列,但可能corePoolSize线程都处于运行状态。

有界队列有限的maximumPoolSizes,有界队列ArrayBlockingQueue。有助于防止资源耗尽,但是可能较难调整和控制。队列大小和最大池大小可能需要相互折衷;使用大队列和小型池可以最大限度的降低CPU使用率,操作系统资源和上下文切换的开销,但是可能导致人工降低吞吐率,如果任务频繁阻塞,那还不如多几个线程呢,对吧。使用小队列通常要求较大的池大小,CPU使用率较高,但是可能遇到不可接受的调度开销(线程切换开销很大的),这样也会降低吞吐率。

 

RejectedExecutionHandler 处理者的各种策略

1.CallerRunsPolicy不想抛弃任务,直接使用调用execute的线程来执行。

2.AbortPolicy丢任务,抛异常

3.DiscardPolicy丢任务,不抛异常

4.DiscardOldestPolicy如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值