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

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);
        }
    }
}

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

相关推荐
峥嵘life21 小时前
Android16 311Y3 EAP-TLS 网络连接失败分析与修复总结
android·开发语言·人工智能·php
M-Robots echo21 小时前
轻量化裁剪方案解析:M-Robots 模块化构建,适配高低端各类机器人硬件平台
java·机器人·ros·开源社区·atomgit·m-robots
不可求~21 小时前
多模型路由怎么落地:把任务分流写进项目的最小实现
java·前端·数据库
mldong1 天前
用 DDD 设计工作流引擎:聚合根与充血模型
java·架构
mqiqe1 天前
AgentScope Java Harness:4. 双层记忆系统 让 Agent 拥有真正的“长期大脑“
java·开发语言
伍一511 天前
03-文件管理模块-一个看似简单的模块藏着多少细节
java·ruoyi·若依
gugucoding1 天前
46. 【Java】JUC并发工具:让并发更简单
java·开发语言
Nebula_g1 天前
JavaSE基础语法:面向对象高级(代码中的成分)
java·开发语言·编程·javase·技术栈·高级语法
for_ever_love__1 天前
python基础语法学习: 异常的传递性
开发语言·python·学习
AC赳赳老秦1 天前
公开图片 OCR 数据提取:OpenClaw 合规采集公开信息图,识别文字与表格并转化为结构化数据
java·大数据·前端·数据库·python·php·openclaw