java 线程池 策略_Java多线程之线程池的手写改造和拒绝策略

目录

自定义线程池的使用

四种拒绝策略代码体现

1. 自定义线程池的使用

自定义线程池(拒绝策略默认AbortPolicy)

public class MyThreadPoolDemo {

public static void main(String[] args) {

ExecutorService threadPool = new ThreadPoolExecutor(2,

5,

1L,

TimeUnit.SECONDS,

new LinkedBlockingQueue(3),

Executors.defaultThreadFactory(),

new ThreadPoolExecutor.AbortPolicy());

try {

//        模拟10个用户来办理业务,每个用户就是一个来自外部的请求线程。

for (int i = 1; i <= 5; i++) {

threadPool.execute(() -> {

System.out.println(Thread.currentThread().getName() + "\t 办理业务");

});

}

} catch (Exception e) {

e.printStackTrace();

} finally {

threadPool.shutdown();

}

}

}

当线程为5时执行结果:

a2587b1b89d8aa04928e4cf58f5d805a.png

2. 四种拒绝策略代码体现

AbortPolicy(默认):直接抛出RejectedExecutionException异常阻止系统正常运行。

当线程数为9时,抛出异常。

6b189bae48804b1f31a5289a4f610eec.png

CallerRunsPolicy:"调用者运行"一种调节机制,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退到调用者,从而降低新任务的流量。

CallerRunsPolicy 拒绝策略,将线程变为10时执行结果

645b19e6192681f93f9872fb6b24b54e.png

DiscardOldestPolicy:抛弃队列中等待最久的任务,然后把当前任务加入队列中尝试再次提交当前任务。

DiscardOldestPolicy拒绝策略,将线程变为10时执行结果:

dd7552455dd68fc6263902641af735c1.png

DiscardPolicy:直接丢弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的一种方案。

DiscardPolicy拒绝策略,直接丢包,将线程变为10时执行结果:

1ac59ecad8933521080ef1a46666343f.png

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值