JUC系列(六) 线程池

article/2025/9/19 18:10:13

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

线程池

池化技术、

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

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

线程池的好处:

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

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

三大方法

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

image-20220302213232478

代码实例

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

三大方法的创建代码

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

七大参数

七大参数

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

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

image-20220303182515651

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

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

代码实例

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数量//超过的话就会 爆出异常 :RejectedExecutionExceptionfor (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密集型 有几个核心就定义几个,可以保证效率最高

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


http://chatgpt.dhexx.cn/article/FT9g2EYG.shtml

相关文章

JUC系列(五)

1、ThreadLocal 1.1、什么是ThreadLocal 线程局部变量。 1.2、ThreadLocal的作用以及可以为什么保证线程安全&#xff1f; 多线程访问同一个共享变量的时候容易出现并发问题&#xff0c;特别是多个线程对一个变量进行写入的时候&#xff0c;为了保证线程安全&#xff0c;一…

JUC系列(二)

1、聊一聊Java“锁” 1.1、乐观锁和悲观锁 悲观锁&#xff1a;认为自己在使用数据的时候一定有别的线程来修改数据&#xff0c;因此在获取数据的时候会先加锁&#xff0c;确保数据不会被别的线程修改。synchronized关键字和Lock的实现类都是悲观锁。适合写操作多的场景&#…

JUC概述

JUC是什么&#xff1f; JUC就是java.util.concurrent,java.util.concurrent.atomic和java.util.concurrent.locks三个工具类包&#xff0c;它们是处理线程的工具包&#xff0c;最开始出现是从JDK 1.5开始出现。&#xff08;JUC就是java.util.concurrent工具类的首字母&#xf…

JUC系列一:什么是JUC

前言&#xff1a;笔记整理参考尚硅谷周阳老师在B站上的JUC教程&#xff0c;万分感谢周阳老师。有兴趣的朋友可以在B站搜索周阳老师的视频教程&#xff0c;绝对让你受益匪浅&#xff0c;期望未来也能成为像周阳老师那样的人O(∩_∩)O哈哈~。 JUC B站视频地址 https://www.bilib…

01_JUC概述

1. JUC是什么&#xff1f; 在 Java 5.0 提供了 java.util.concurrent(简称JUC)包&#xff0c;在此包中增加了在并发编程中很常用的工具类。此包包括了几个小的、已标准化的可扩展框架&#xff0c;并提供一些功能实用的类&#xff0c;没有这些类&#xff0c;一些功能会很难实现或…

JUC系列(三)

1、Java内存模型 1.1、什么是Java内存模型JMM&#xff1f; JMM(Java内存模型Java Memory Model&#xff0c;简称JMM)本身是一种抽象的概念并不真实存在&#xff0c;它仅仅描述的是一组约定或规范&#xff0c;通过这组规范定义了程序中(尤其是多线程)各个变量&#xff08;包括…

JUC系列——基础知识 day1-1

JUC系列——基础知识 day1-1 JUC基础知识进程线程进程和线程区别并行与并发同步使用场景 异步使用情景 QuickStart&#xff08;new Thread方式创建新线程&#xff09;匿名内部类方式lambda简化 Thread类&#xff08;仅分析功能&#xff09;优先级常量方法&#xff08;常用&…

JUC系列(六)

1、AbstractQueuedSynchronizer之AQS AbstractQueuedSynchronizer简称为AQS&#xff0c;抽象的队列同步器 AQS&#xff1a;是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石&#xff0c;使用一个int类变量表示持有锁的状态&#xff0c;通过内置的FIFO队列…

JUC系列(一)

1、为什么多线程极其重要&#xff1f; ​ 多线程变得极其重要的原因从软硬件两个方面来说&#xff0c;首先硬件方面&#xff1a;主要是摩尔定律失效&#xff0c;它是由英特尔创始人之一Gordon Moore(戈登摩尔)提出来的,其内容是当价格不变时&#xff0c;将每隔18个月&#xff…

JUC系列(一)什么是JUC?

多线程一直Java开发中的难点&#xff0c;也是面试中的常客&#xff0c;趁着还有时间&#xff0c;打算巩固一下JUC方面知识&#xff0c;我想机会随处可见&#xff0c;但始终都是留给有准备的人的&#xff0c;希望我们都能加油&#xff01;&#xff01;&#xff01; 沉下去&#…

JUC系列——JUC入门及多线程并发

文章目录 前言一、JUC简介1、出自哪位大神之手&#xff1f;2、JUC是什么&#xff1f; 二、JUC主要解决什么问题&#xff1f;1、进程 、线程2、并发、并行3、JAVA创建线程的方式&#xff08;模拟三种线程实现方式&#xff09;1&#xff09;继承Thread类&#xff08;线程的初级用…

Java进阶|JUC系列(持续更新)

文章目录 1、什么是J.U.C2、进程、线程、协程2.1 简介2.2 线程有几个状态2.3 wait和sleep的区别 3、Lock锁(重点)3.1 简介3.2 lock锁和synchronized有什么区别 4、生产者和消费者问题4.1 简介4.2 使用synchronized实现的demo4.3使用Lock实现的demo 5、锁的是谁问题1、两个线程访…

莱布尼茨公式C语言编程,高等数学——手撕牛顿莱布尼茨公式

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注 今天是高等数学专题的第13篇文章&#xff0c;我们来看看定积分究竟应该怎么计算。 定积分的实际意义 通过之前的文章&#xff0c;我们基本上熟悉了定积分这个概念和它的一些简单性质&#x…

[计算机数值分析]牛顿插值公式

Spring-_-Bear 的 CSDN 博客导航 埃特金算法虽然具有承袭性&#xff0c;但其算式是递推型的&#xff0c;不便于进行理论上的分析。所以采用具有承袭性的显式的牛顿插值公式是不错的选择。 p n ( x ) f ( x 0 ) f ( x 0 , x 1 ) ( x − x 0 ) . . . f ( x 0 , x 1 , . . . …

如何用计算机做牛顿迭代公式,牛顿迭代法

牛顿迭代法(Newtons method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。 中文名 牛顿迭代法 外文名 Newtons method别 名 牛顿-拉夫逊(拉弗森)方法 提出时间 17世纪 牛顿迭代法产生背景 编辑…

牛顿恒等式 牛顿和

前言&#xff1a;仅个人小记。该恒等式推导逻辑非常简洁。目标&#xff1a;求一个多项式的所有根的次幂和。比如多项式 P ( x ) Σ i 0 n a i x i P(x)\Sigma_{i0}^{n}a_i x^i P(x)Σi0n​ai​xi的根为 α , β , . . . , ω \alpha,\beta,...,\omega α,β,...,ω&#xff…

牛顿插值公式

均差&#xff08;差商&#xff09; f[x0,x1]f(x1)−f(x0)x1−x0 一阶 f[x0,x1,x2]f(x1,x2)−f(x0,x1)x2−x0 二阶 ⋮ 性质 1.对上述二解均差展开&#xff0c;得&#xff0c; f[x0,x1,x2]f(x0)(x0−x1)(x0−x2)f(x1)(x1−x0)(x1−x2)f(x2)(x2−x0)(x2−x1) 依次类推 有&am…

5.3 牛顿-科茨公式

学习目标&#xff1a; 理解微积分基础知识&#xff0c;例如导数和微分的概念。学习牛顿-科茨公式的推导过程。这个公式实际上是使用泰勒公式对被积函数进行展开&#xff0c;并使用微积分的基本原理进行简化得到的。学习如何使用牛顿-科茨公式进行数值积分。这通常涉及到将被积…

牛顿迭代公式

问题背景 给定任意一个数x&#xff0c;求其平方根z&#xff0c;平方误差小于0.001。 这个问题直观的去想&#xff0c;我们一般会采取设定一个初始值&#xff0c;然后通过迭代逐渐逼近平方根&#xff0c;但是初始值怎样去迭代才能更快”逼近“成为关键问题&#xff0c;牛顿迭代…