线程池的拒绝策略

一、拒绝策略的启动

  1. 每过来一个任务会启动一个线程去执行
  2. 当核心线程数用完后,会把新来的任务存入阻塞队列中
  3. 阻塞队列存满后,会再启动超过核心线程数量到最大线程数量之间的线程
  4. 当线程的数量达到最大线程数量,再来任务就启动拒绝策略

二、拒绝策略的分类

创建一个线程任务

class TaskThread implements Runnable{

        private int i;

        public TaskThread(int i) {
            this.i = i;
        }

        @Override
        public void run() {
            try {
                TimeUnit.SECONDS.sleep(2);
                System.out.println("执行任务:" + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

   1.默认拒绝策略,拒绝任务并抛出任务

        AbortPolicy abortPolicy = new ThreadPoolExecutor.AbortPolicy();

// 拒绝策略 默认拒绝策略,拒绝任务并抛出异常:
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler);
        for (int i = 1; i <= 5; i++) {
            try {
                threadPool.execute(new TaskThread(i));
            } catch (Exception e) {
                System.out.println("【任务" + i + "】报错:" + e.getMessage());
            }

        }
【任务】4报错:Task com.test.controller.ThreadPoolController$TaskThread@5c0369c4 rejected from java.util.concurrent.ThreadPoolExecutor@50675690[Running, pool size = 2, active threads = 2, queued tasks = 1, completed tasks = 0]
【任务】5报错:Task com.test.controller.ThreadPoolController$TaskThread@31b7dea0 rejected from java.util.concurrent.ThreadPoolExecutor@50675690[Running, pool size = 2, active threads = 2, queued tasks = 1, completed tasks = 0]
执行任务:1
执行任务:3
执行任务:2


   2.丢弃当前被拒绝的任务

        DiscardPolicy discardPolicy = new ThreadPoolExecutor.DiscardPolicy();

RejectedExecutionHandler handler = new ThreadPoolExecutor.DiscardPolicy();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler);
        for (int i = 1; i <= 5; i++) {
            try {
                threadPool.execute(new TaskThread(i));
            } catch (Exception e) {
                System.out.println("【任务" + i + "】报错:" + e.getMessage());
            }

        }
执行任务:1
执行任务:3
执行任务:2


   3.将工作队列中最老的任务丢弃,然后重新尝试接纳被拒绝的任务

        DiscardOldestPolicy discardOldestPolicy = new ThreadPoolExecutor.DiscardOldestPolicy();

RejectedExecutionHandler handler3 = new ThreadPoolExecutor.DiscardOldestPolicy();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler);
        for (int i = 1; i <= 5; i++) {
            try {
                threadPool.execute(new TaskThread(i));
            } catch (Exception e) {
                System.out.println("【任务" + i + "】报错:" + e.getMessage());
            }

        }
执行任务:3
执行任务:1
执行任务:5


   4.在客户端线程中执行被拒绝的任务

        CallerRunsPolicy callerRunsPolicy = new ThreadPoolExecutor.CallerRunsPolicy();

RejectedExecutionHandler handler = new ThreadPoolExecutor.CallerRunsPolicy();
ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize,
                maximumPoolSize,
                keepAliveTime,
                unit,
                workQueue,
                threadFactory,
                handler);
        for (int i = 1; i <= 5; i++) {
            try {
                threadPool.execute(new TaskThread(i));
            } catch (Exception e) {
                System.out.println("【任务" + i + "】报错:" + e.getMessage());
            }

        }
输出:

执行任务:1
执行任务:4
执行任务:3
执行任务:2
执行任务:5

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值