内置线程池的核心参数分析配置

ThreadPoolExecutor关键字 包括五个参数 corePoolSize、maximumPool、keepAliveTime、unit、workQueue

corePoolSize表示核心进程数, maximumPool表示最大线程数、workQueue表示阻塞队列中进程数

用一个通俗易懂的例子来理解,core这个核心进程数相当于银行工作窗口,workqueue在排队办理业务的人、max表示能开启总共的总窗口。

core设为5,max设为10(其中包括core的5个 剩余的是临时的),workqueue设为20则

情况1 来了20个人 会直接去排队 其中的5个人等着核心core处理

情况2 来了25个人 5个人去core办理 剩余20个人把排队的位子坐满

情况3 来了26个人 前25个人和情况2类似 最后到的1个人 直接到临时窗口办理业务

情况4 来了30个人 其中25个人情况处理和情况2类似 剩余的5个人会直接把剩余的5个临时窗口站全了

情况5 来了31个人 那么前三十个人和情况三类似 舍弃最后一个人(线程池的执行策略:拒绝执行)

补充:临时窗口啥时候关闭呢?当所有的窗口都空闲时,并且空闲的时间超过keepAliveTime,那么5个临时窗口会全部关闭,5个core核心窗口保持打开。

代码示例:

复制代码
public class ThreadPool {
    //工作进程列表
    private List<WorkThread> workList = new ArrayList<>();
    //任务线程
    private List<Runnable> runnableList = new ArrayList<>();
    private int coreSize;
    private int maxSize;
    private int queueSize;

    public ThreadPool(int coreSize,int maxSize,int queueSize){
        this.coreSize = coreSize;
        this.maxSize = maxSize;
        this.queueSize = queueSize;
        //启动任务
        for(int i = 0; i < coreSize; i++){
            WorkThread work = new WorkThread(runnableList);
            new Thread(work).start();
            workList.add(work);
        }
    }

    public void add(Runnable runnable){
        synchronized (runnableList){
            if(runnableList.size() < queueSize){ //核心进程工作
                //添加并唤醒
                runnableList.add(runnable);
                runnableList.notify();
            }else if(workList.size() < maxSize){ //临时进程工作
                System.out.println("临时进程启用");
                WorkThread work = new WorkThread(runnableList);
                new Thread(work).start();
                workList.add(work);
                //让创建的临时进程处理任务
                runnableList.add(runnable);
                runnableList.notify();
            }else{
                System.out.println("拒绝执行");
            }
        }
    }
}
复制代码
public class WorkThread implements Runnable{
    private List<Runnable> runnableList;
    public WorkThread(List<Runnable> runnableList){
        this.runnableList = runnableList;
    }
    public void run(){
        Runnable runnable = null;
        while(true){
            synchronized (runnableList) {
                //判断是否为空
                while (runnableList.isEmpty()) {
                    //执行等待
                    try {
                        runnableList.wait();
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                }
                //不空继续执行 取出进程
                runnable = runnableList.remove(0);
            }
            //执行进程代码
            runnable.run();
        }
    }
}
复制代码
public class Test {

    public static void main(String[] args){

        //传值
        ThreadPool pool = new ThreadPool(5,10,20);
        for(int i = 0; i < 20; i++){
            pool.add(new TestWork(i));
        }
    }
    //自定义任务类
    static class TestWork implements Runnable{
        private int count;
        public TestWork(int count){
            this.count = count;
        }
        public void run(){
            //延时
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }
            System.out.println(Thread.currentThread().getName() + "执行进程: " + count);
        }
    }
}

可以调整任务数来观察结果,会完全符合上述的运行逻辑

相关推荐
乌暮3 小时前
深入理解 Java 泛型:把「万能盒子」用对、用稳
java·开发语言·后端·学习
大猫和小黄3 小时前
深入理解 Java Optional:从设计哲学到工程实战
java
数据库百宝箱3 小时前
rum&gin索引对比
java·数据库·gin
2601_962218613 小时前
C语言中三种库的编译和使用方法
开发语言·c++
传奇开心果编程4 小时前
中庸、有容、破执:仓颉编程语言的中华智慧结晶——三重哲学境界思辨
开发语言·华为·开源·软件工程
yychen_java4 小时前
第六篇:Spring AI 实战:将 Java 业务接口封装成企业级 MCP Server
java·人工智能·spring
jimy14 小时前
派生类重写基类虚函数(二):override的作用
开发语言·c++
_upupup4 小时前
异常(C++)
java·开发语言·jvm
g10565591394 小时前
公有云_云运维服务
java·运维·服务器
霸道流氓气质4 小时前
ComfyUI 图像生成工作流完全指南:从节点编排到Java生产级图像生产实战
java·开发语言·人工智能