java线程池(java.util.concurrent.ThreadPoolExecutor)及其策略的使用一点提醒

例如我们并发任务数是100

_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadPoolExecutor.DiscardOldestPolicy());

上面例子中使用了无界队列,将会把任务都执行完,但是任务调度花费的时间会长

_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.DiscardOldestPolicy());

上面例子中使用了有界队列,任务只能执行80个,有20个被抛弃,任务调度时间很快

如果将最大线程数和队列最大有限容量的和设置为大于或等于100,任务可以执行完,任务调度时间

很快,任务调度时间有二个值影响:

corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
corePoolSize起决定作用,maximumPoolSize其次

如果使用有界队列,DiscardOldestPolicy策略使用时候需要注意的是maximumPoolSize和队列容量之和要不小于最大并发数,否则当任务并发数达到最大时你的任务可能被丢弃

_executor = new ThreadPoolExecutor(2, 50, 1, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(30), new ThreadPoolExecutor.CallerRunsPolicy());

上面例子使用了CallerRunsPolicy策略,如果线程池内活动线程数达到maximumPoolSize,如果此时还有并发任务数还在迅速增大,线程池会使用调用者的线程执行任务,如果有执行时间很长的任务并发,要慎用该策略
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值