JUC系列(六) 线程池

news/2024/5/20 9:27:37 标签: java, jvm, 开发语言, JUC, 高并发

📣 📣 📣 📢📢📢
☀️☀️你好啊!小伙伴,我是小冷。是一个兴趣驱动自学练习两年半的的Java工程师。
📒 一位十分喜欢将知识分享出来的Java博主⭐️⭐️⭐️,擅长使用Java技术开发web项目和工具
📒 文章内容丰富:覆盖大部分java必学技术栈,前端,计算机基础,容器等方面的文章
📒 如果你也对Java感兴趣,关注小冷吧,一起探索Java技术的生态与进步,一起讨论Java技术的使用与学习
✏️高质量技术专栏专栏链接: 微服务数据结构netty,单点登录,SSMSpringCloudAlibaba
😝公众号😝想全栈的小冷,分享一些技术上的文章,以及解决问题的经验
当前专栏JUC系列

线程池

池化技术、

程序的运行 本质: 占用系统的资源 ! 优化资源的使用 =>池化技术

线程池,连接池,内存吃,对象池, 频繁的创建销毁 十分的浪费资源

线程池的好处:

  1. 降低资源的消耗
  2. 提高响应的速度
  3. 方面管理

线程的复用 可以控制最大并发数量,管理线程

三大方法

下图来自 阿里巴巴开发规约手册

image-20220302213232478

代码实例

java">public class poolDemo {
    public static void main(String[] args) {
        //单个线程
        ExecutorService Threadpool = Executors.newSingleThreadExecutor();
        // 创建一个固定的线程池大小
        //ExecutorService Threadpool = Executors.newFixedThreadPool(5);
        //可以伸缩的 遇强则强
        // ExecutorService Threadpool = Executors.newCachedThreadPool();

        try {
            for (int i = 0; i < 10; i++) {
                Threadpool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "=> ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池使用完毕 一定要关闭
            Threadpool.shutdown();
        }
    }
}

三大方法的创建代码

java">public static ExecutorService newSingleThreadExecutor() {
    return new FinalizableDelegatedExecutorService
        (new ThreadPoolExecutor(1, 1,
                                0L, TimeUnit.MILLISECONDS,
                                new LinkedBlockingQueue<Runnable>()));
}

public static ExecutorService newFixedThreadPool(int nThreads) {
    return new ThreadPoolExecutor(nThreads, nThreads,
                                  0L, TimeUnit.MILLISECONDS,
                                  new LinkedBlockingQueue<Runnable>());
}

public static ExecutorService newCachedThreadPool() {
    return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                  60L, TimeUnit.SECONDS,
                                  new SynchronousQueue<Runnable>());
}

七大参数

七大参数

java">public ThreadPoolExecutor(int corePoolSize, //核心线程池大小
                          int maximumPoolSize,// 最大核心线程数大小
                          long keepAliveTime,// 超时了没有人调用就会释放
                          TimeUnit unit,// 超时单位
                          BlockingQueue<Runnable> workQueue,// 阻塞队列
                          ThreadFactory threadFactory, // 线程工厂,创建线程的
                          RejectedExecutionHandler handler// 拒绝策略
                         ) 
   

这七个参数分别有什么作用呢,思路图

image-20220303182515651

手动创建线程池,不用封装好的方法,使用原生的线程池方法

java">ThreadPoolExecutor threadpool = new ThreadPoolExecutor(
        2,
        5,
        3,
        TimeUnit.SECONDS,
        new LinkedBlockingDeque<>(3),
        Executors.defaultThreadFactory(),
        // 这个时候 举例子,银行的人满了 这种方式就是 不处理 抛出异常
        new ThreadPoolExecutor.AbortPolicy()
);

线程池四种拒绝策略

  • new ThreadPoolExecutor.AbortPolicy() 银行的人满了 这种方式就是 不处理 抛出异常

    执行效果

    image-20220303183829048

  • new ThreadPoolExecutor.CallerRunsPolicy() 银行人满了,哪里来的去哪里,回到调用线程输出,不会异常

    执行结果

    image-20220303183923829

  • new ThreadPoolExecutor.DiscardPolicy() 队列满了 就抛出全部任务,

    执行结果

    image-20220303184035431

  • new ThreadPoolExecutor.DiscardOldestPolicy() 尝试和最早的线程竞争 查看是否有位置,没有就抛出任务

    执行结果

    image-20220303184127445

代码实例

java">public class poolDemo {
    public static void main(String[] args) {
        ThreadPoolExecutor threadpool = new ThreadPoolExecutor(
                2,
                5,
                3,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );


        //单个线程
        //ExecutorService Threadpool = Executors.newSingleThreadExecutor();
        // 创建一个固定的线程池大小
        //ExecutorService Threadpool = Executors.newFixedThreadPool(5);
        //可以伸缩的 遇强则强
        // ExecutorService Threadpool = Executors.newCachedThreadPool();

        try {
            //最大承载如何计算 : 阻塞队列+max数量
            //超过的话就会 爆出异常 :RejectedExecutionException
            for (int i = 1; i <= 15; i++) {
                threadpool.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "=> ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //线程池使用完毕 一定要关闭
            threadpool.shutdown();
        }
    }
}

最大负载

  1. CPU密集型 有几个核心就定义几个,可以保证效率最高

    java">    Runtime.getRuntime().availableProcessors() //获取cpu 核心数
    
  2. IO 密集型 判断程序中 十分消耗IO资源的线程,如: 程序 有 15个大型任务,io 十分占中资源,那么设定的比任务数量大 就可以保证一定性能、


http://www.niftyadmin.cn/n/13547.html

相关文章

DevOps的流程与规范介绍

在DevOps中想要实现快速、高质量的业务交付&#xff0c;流程和规范是至关重要的。流程包含软件从需求提出到产品上线投产全套生命周期的所有环节&#xff0c;如需求提出、代码提交、上线流程等。规范包含敏捷需求分解规范、用户故事编写规范、需求输出表等。 一、流程 流程用…

计算机毕业设计Java车险销售管理系统(源码+系统+mysql数据库+lw文档)

计算机毕业设计Java车险销售管理系统(源码系统mysql数据库lw文档) 计算机毕业设计Java车险销售管理系统(源码系统mysql数据库lw文档)本源码技术栈&#xff1a; 项目架构&#xff1a;B/S架构 开发语言&#xff1a;Java语言 开发软件&#xff1a;idea eclipse 前端技术&#…

在线编程教学技术解决方案,覆盖所有授课场景需求

在线编程教学是一种应用较为广泛的远程教学形式&#xff0c;例如&#xff1a;互动体验&#xff0c;音视频技术的普及&#xff0c;对线上教学的质量与学习效率带来了很大的提升。在线编程教学可以让教师对学生进行在线编程教学&#xff0c;以一对多小班教学为主。那么在线编程教…

Java语言有多少优势(总结版)

现在有越来越多的新技术工具、新语言涌现&#xff0c;面对林林总总的语言&#xff0c;总会有人问&#xff1a; 这么多语言应该先学哪一种&#xff1f; 什么语言值得我们长时间地学习&#xff1f; 学完之后职业发展前景大吗&#xff1f; 那么&#xff0c;我给出的答案是Java …

Gomodule和GoPath

GoLang生态系统 什么是GOROOT GOROOT 是环境变量&#xff0c;它的值是 Golang 安装包路径 什么是GOPATH GOPATH 是Golang 1.5版本之前一个重要的环境变量配置&#xff0c;是存放 Golang 项目代码的文件路径。 可以通过go env命令查看 GOPATH目录 进入GOPATH目录&#xff…

Pytest自动化测试框架---(单元测试框架)

unittest是python自带的单元测试框架&#xff0c;它封装好了一些校验返回的结果方法和一些用例执行前的初始化操作&#xff0c;使得单元测试易于开展&#xff0c;因为它的易用性&#xff0c;很多同学也拿它来做功能测试和接口测试&#xff0c;只需简单开发一些功能&#xff08;…

Elasticsearch 安装及启动【Windows】

一、下载 Elasticsearch 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 选择自己所需版本进行下载&#xff0c;这里以Elasticsearch 8.2.2 为例 点击 Download&#xff0c;选择 Windows 版本 二、使用步骤 1.安装 Elasticse…

简历上写着“精通 MySQL”,阿里面试官非要跟我死磕,最后还是给我发了 offer

事情是这样的 前段时间因为想要跳槽就去面试了下阿里&#xff0c;大家也都清楚&#xff0c;精通这个词在简历上属于很难把握住的一个词&#xff0c;如果你在你的简历上面写着你精通 XX 技术&#xff0c;那面试官就会默认你是真的很会&#xff0c;刨根问底问到你崩溃。 我之前…