Java自定义线程池来模拟银行办理业务场景来解析ThreadPoolExecutor的七大参数和四大拒绝策略

本文通过Java的ThreadPoolExecutor详细讲解了如何创建线程池,并以银行办理业务为场景,模拟了线程池的七大参数配置,包括核心线程数、最大线程数、线程存活时间、任务队列、线程工厂和拒绝策略。当业务量超出线程池容量时,银行采取了DiscardOldestPolicy拒绝策略,即丢弃最旧的任务。测试结果显示,线程池能够根据任务量动态调整窗口数量,并在超出负荷时执行拒绝策略。
摘要由CSDN通过智能技术生成

1.在阿里巴巴开发手册中指出不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,所以大部分我们都是使用ThreadPoolExecutor
在这里插入图片描述
2.使用ThreadPoolExecutor 那么就得知道七大参数
在这里插入图片描述
3.四种拒绝策略
在这里插入图片描述
4.正常银行办理业务场景
在这里插入图片描述
解析:这里只开了两个窗口办理业务,当客户来办理时只能在这两个窗口办理业务,人越来越多,就会在候客区等待,依次办理业务

5.假设有一天要办理的客户超级多
在这里插入图片描述
解析:当客户很多是,那么银行就会开启其他几个窗口,当窗口人数已满,候客区也满了,这时候还有客户来办理业务,那么银行就会采取拒绝措施(这里只是虚拟,正常银行不会这么干,只是客户自己会选择离开)

6.Java自定义线程池来模拟银行办理业务场景

package com.kuang.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class ThreadPoolExecutorDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                2,//开启的窗口
                5,//最多的窗口
                2,//超时的时间
                TimeUnit.SECONDS,//超时的单位
                new LinkedBlockingQueue<>(3),//候客区
                Executors.defaultThreadFactory(),//创建线程的工厂
                new ThreadPoolExecutor.DiscardOldestPolicy()//银行的拒绝策略
        );

        try {
            //最大承载:Deque + max
            //超过 RejectedExecutionException
            for (int i = 1; i <= 9; i++) {
                threadPool.execute(()->{
                    System.out.println(Thread.currentThread().getName()+" ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPool.shutdown();
        }
    }
}

测试结果:当1~5人办理业务时只会在第一和第二个窗口进行办理
在这里插入图片描述
测试结果:当6~8人办理业务是,就会开启5个窗口办理业务
在这里插入图片描述
测试结果:当超过8人时,银行就会采取拒绝策略(这里采用抛出异常)
在这里插入图片描述
7.七大参数提取

ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
     2,//开启的2个窗口
     5,//最多的窗口
     2,//超时的时间,就是超过一定时间,其他3个窗口就会关闭
    TimeUnit.SECONDS,//超时的单位
    new LinkedBlockingQueue<>(3),//候客区
    Executors.defaultThreadFactory(),//创建线程的工厂
    new ThreadPoolExecutor.DiscardOldestPolicy()//银行的拒绝策略
  );
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值