JUC和线程池的详细讲解

article/2025/10/12 6:04:15

这里写目录标题

  • JUC介绍
    • 基本概念
    • JUC中的类和接口
    • 主要包含功能
  • 线程池
    • 为什么使用线程池
    • 什么是线程池
    • 使用线程池的特点
      • 优点
      • 缺点
  • JUC中的线程池
    • Executor介绍
    • ThreadPoolExecutor
      • ThreadPoolExecutor是JUC中提供的默认线程池实现类
      • 构造方法
      • 参数详解
      • corePoolSize 核心线程数
      • 2. workQueue 阻塞队列
      • 3. maximumPoolSize 最大线程数
      • 4. keepAliveTime 线程最大空闲时间
      • 5. unit keepAliveTime 时间单位
      • 6. threadFactory 线程工厂
      • 7. handler 线程池拒绝策略(面试题:线程池拒绝策略有哪些)
  • 8. 线程池总结 (常见面试题)
  • Executors
    • newCachedThreadPool()
    • newFixedThreadPool(int)
    • newScheduledThreadPool(int)
    • newWorkStealingPool()
    • ForkJoinPool介绍
    • 线程池代码演示
  • JUC中的AtomicInteger原子类
    • 原子性介绍
    • JUC中原子类
    • 使用AtomicInteger保证线程安全
      • 原始方式: 使用synchronized同步锁解决
      • 原子类方式: 使用AtomicInteger原子类
      • 原子类AtomicInteger方法介绍
      • 原子类AtomicInteger底层实现
    • Volatitle(面试题)
      • 可见性
      • 可见性原理
      • 嗅探机制工作原理
      • 有序性
    • CAS算法(面试题)
      • CAS算法介绍
      • 优点
      • 缺点
      • ABA问题
      • 解决ABA问题
    • 源码分析AtomicInteger原子类
      • 底层实现
      • 源码重点

JUC介绍

基本概念

从Java 5开始,在JDK中多出了java.util.concurrent包(简称:JUC)。
JUC主要是让开发者在多线程编程中更加简单、方便一些。
通过JDK内置了一些类、接口、关键字,补充完善了JDK对于并发编程支持的“短板

JUC中的类和接口

通过IDEA可以看java.util.concurrent包中所有的类和接口
在这里插入图片描述
在这里插入图片描述

主要包含功能

Executor:线程池
Atomic:原子操作类
Lock:锁
Tools:信号量工具类
并发集合:提供了线程安全的集合类。

在这里插入图片描述

线程池

为什么使用线程池

线程的创建和线程的销毁都会消耗一定的系统资源。
如果需要频繁的新建线程、销毁线程,对于系统可能需要消耗大量资源。
如何在需要频繁新建、销毁线程的场景下保证系统响应时间更快,消耗资源更少?

只有使用线程池

什么是线程池

内存中的一块空间。这块空间里面存放一些已经实例化好的线程对象。
当代码中需要使用线程时直接从线程池获取。当代码中线程执行结束或需要销毁时,把线程重新放入回到线程池,而不是让线程处于死亡状态

在这里插入图片描述

使用线程池的特点

优点

1.降低系统资源消耗。通过重用线程对象,降低因为新建和销毁线程产生的系统消耗。
2.提高系统响应速度。直接从内存中获取线程对象,比新建线程更快。
提供线程可管理性。通过对线程池中线程数量的限制,避免无限创建线程导致的内存溢出或CPU资源耗尽等问题

缺点

默认情况下,无论是否需要使用线程对象,线程池中都有一些线程对象,也就是说会占用一定内存

JUC中的线程池

Executor介绍

线程池的顶级接口,所有线程的子类

在这里插入图片描述
在这里插入图片描述

ThreadPoolExecutor

ThreadPoolExecutor是JUC中提供的默认线程池实现类

构造方法

提供了四种参数列表的构造方法
在这里插入图片描述
其中包含7个参数的构造方法, 这是ThreadPoolExecutor支持的所有参数
在这里插入图片描述

参数详解

corePoolSize 核心线程数

创建线程池后,默认线程池中并没有任何的线程,执行了从线程池获取线程的时候才会创建核心线程并返回. 如果没有达到指定的corePoolSize, 即使有空闲的核心线程, 也会创建新的核心线程执并返回, 直到达到了corePoolSize. 达到corePoolSize后, 从线程池获取线程, 有空闲的核心线程, 就返回空闲的线程
理解: 线程池就相当于一个公司, 核心线程数就相当于正式工人数, 新公司成立, 接一个新任务就会招聘一个正式工, 即使有空闲的正式工, 来了新任务也会招聘新的正式工来完成新任务, 直到招满为止. 招满后, 新任务就由空闲的正式工来完成

2. workQueue 阻塞队列

当线程池中的线程数目达到指定的corePoolSize后,并且所有的核心线程都在使用中, 再来获取线程将会被添加到缓存任务的阻塞队列中,也就是workQueue
队列可以设置queueCapacity 参数,表示任务队列最多能存储多少个线程对象
理解: 正式工已经招满, 此时所有的正式工都在忙着工作, 再来的新任务, 就只能排队等待

3. maximumPoolSize 最大线程数

被使用的线程数大于或等于核心线程数,且任务队列已满时,线程池会创建新的线程,直到线程数量达到maxPoolSize。
被使用的线程数等于maxPoolSize,且任务队列已满,则已超出线程池的处理能力,线程池会拒绝处理任务而抛出异常
理解: 正式工已经招满, 此时所有的正式工都在忙着工作, 且队列中的新任务已达到队列上线, 需要招聘临时工, 来完成任务. 正式工和临时工的总数为公司的最大员工数, 如果所有的临时工也都有任务, 再来新任务公司予以拒绝

4. keepAliveTime 线程最大空闲时间

线程池中没有被使用的线程, 就会处于空闲(alive)状态, 只要超过keepAliveTime, 空闲的线程就会被销毁,直到线程池中的线程数等于corePoolSize
如果设置了allowCoreThreadTimeOut=true(默认false),核心线程也可以被销毁
理解: 到了淡季, 公司不忙了, 很多的正式工和临时工都空闲了, 临时工就直接解雇了, 而正式工没有重大违纪的不会解雇

5. unit keepAliveTime 时间单位

TimeUnit是枚举类型
包含如下时间单位
在这里插入图片描述
注:
1秒 = 1000毫秒 1毫秒 = 1000微秒 1微妙 = 1000纳秒

6. threadFactory 线程工厂

主要用来创建线程

7. handler 线程池拒绝策略(面试题:线程池拒绝策略有哪些)

只有核心线程都在使用中,任务队列已满,且线程数量已经达到maximunPoolSize才会触发拒绝策略。或在调用shutdown()和真正关闭线程池之间提交的任务都会被决绝。因为线程池被shutdown()时,会等待线程池内线程对象执行结束,才关闭线程池

在这里插入图片描述
DiscardoldestPolicy: 从队列中去掉一个最先进入队列的任务。然后重新提交被拒绝的任务(重复此过程)
AbortPolicy:丢弃任务,抛出运行时异常(RejectedExecutionException)(默认值)
CallerRunsPolicy:由调用该任务的线程处理, 线程池不参与
DiscardPolicy:丢弃任务,不抛出异常

8. 线程池总结 (常见面试题)

corePoolSize: 核心线程数大小
maximunPoolSize:最大线程数大小(包含核心线程数,剩下的就是普通线程数)
queueCapacity:任务队列最大长度
keepAliveSize:线程最大空闲时间
allowCoreThreadTimeOut:核心线程超时是否被销毁(默认 false)
handler:拒绝策略
workQueue:任务队列类型

1.当线程数小于核心线程数时,创建线程, 直到到达核心指定的核心线程数
2.当线程数大于等于核心线程数,且任务队列未满时,将任务放入任务队列
3.当线程数大于等于核心线程数,且任务队列已满
若线程数小于最大线程数,创建线程, 直到达到最大线程数
若线程数等于最大线程数,抛出异常,拒绝任务

在这里插入图片描述

Executors

Executors可以帮助快速实例化特定类型的线程池对象, Executors属于一个工具类
返回值都是ExecutorService接口的实现类, 底层都是调用ThreadPoolExecutor()在这里插入图片描述

newCachedThreadPool()

不需要要参数,基本上都是默认值

构造方法参数:
corePoolSize: 0
maximumPoolSize: Integer的最大值
keepAliveTime: 60秒
workQueue:SynchronousQueue
同步队列, 一个线程向队列put(放入)数据后,阻塞等待被take(取出)
效果总结:线程需要时就新建,空闲60秒后被销毁。默认都是放在同步队列中。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/7xgDIEAJ.shtml

相关文章

JUC(并发编程)

该笔记大部分搬运B站遇见狂神说的javaJUC,顺便把图文合并记录,便于回顾 视频地址:【狂神说Java】JUC并发编程最新版通俗易懂_哔哩哔哩_bilibili记得三连 目录 1.什么是JUC? 2.线程进程和程序 3.Lock锁(重点) 4.生产者和消费者问题! 5.八锁现…

JUC详解 | JUC概述

JUC详解 | JUC概述及其基础知识准备 前言一、1. JUC概述及基础知识准备1.JUC是什么?2. 进程和线程3. 并行和并发4. wait/sleep的区别5.创建线程回顾6. lambda表达式6.1 什么是lambda表达式6.2 案列6.3函数式接口6.4 小结 7. synchronized回顾8. synchronized的8锁问…

juc_lock

一个不是juc一个是juc情况 class Data2{private int number 0;Lock lock new ReentrantLock();Condition condition lock.newCondition();public void increment() throws Exception{lock.lock();try {while (number ! 0){condition.await();}number ;System.out.println(T…

JUC基础(周阳老师笔记

目录 一、JMM1.volatile2.加载代码练习: 二、JUC基础1.什么是进程/线程,并发/并行进程/线程并发/并行 2.线程的状态3.线程 操作 资源类4.Lambda表达式jdk8以后的interface 5.判断/干活/通知6.防止虚假唤醒(while not if)7.标志位lock精准通知condition 8…

什么是JUC

什么是JUC JUC指的是:Java里的三个包 java.util.concurrentjava.util.concurrent.atomic:原子性java.util.concurrent.locks:lock锁 回顾线程和进程 进程 程序执行的一次过程,一个进程包含一个或多个线程。进程是资源分配的单位…

Java - JUC详解

目录 一、了解和JUC相关的概念 二、Java线程 三、线程共享模型 一、了解和JUC相关的概念 1.1 什么是JUC? JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和…

JUC线程池

一、JUC介绍 java.util.concurrent包(简称:JUC)。JUC主要是让开发者在多线程编程中更加简单、方便一些。 通过JDK内置了一些类、接口、关键字,补充完善了JDK对于并发编程支持的“短板”。 主要功能:(1&am…

JUC

(尚硅谷笔记) Java JUC 简介  在 Java 5.0 提供了 java.util.concurrent (简称 JUC )包,在此包中增加了在并发编程中很常用 的实用工具类,用于定义类似于线程的自定义子 系统,包括线程池、异…

JUC基础知识(个人总结)

声明: 1. 本文为我的个人复习总结, 并非那种从零基础开始普及知识 内容详细全面, 言辞官方的文章 2. 由于是个人总结, 所以用最精简的话语来写文章 3. 若有错误不当之处, 请指出 一. 前置基础: IO 操作不占用 cpu, 只是我们一般拷贝文件使用的是【…

1、JUC概述

1.1 什么是JUC 在Java中,线程部分是一个重点,本篇文章说的JUC 也是关于线程的。JUC就是java.util .concurrent工具包的简称。这是一个处理线程的工具包,JDK1.5开始出现的。 1.2 线程和进程的概念 进程和线程 进程(Process&…

JUC基础【万字篇】

JUC 1、什么是JUC JUC:指的是java.util三个并发编程工具包 java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.locks 实现多线程的四种方式: 继承Thread类实现Runnable接口实现Callable接口线程池 业务:普通的线程代…

java--JUC快速入门(彻底搞懂JUC)

java–JUC快速入门(彻底搞懂JUC) 文章目录 java--JUC快速入门(彻底搞懂JUC)1、学习多线程之前需要知道的一些概念。2、JUC的结构3、Lock锁(重点)4、集合类不安全5、Callable()6、常用的辅助类7、读写锁8、阻塞队列9、线程池 1、学…

Dbeaver做数据迁移

1、选择源头数据库的表、鼠标右击、选择导出数据 2、在数据转化弹框中,双击 ‘数据库,数据表’ 那一栏 3、选择目标数据库,调整字段类型映射关系 4、调整字段的映射关系 目前遇到的字段类型,只有 int,bigint 转 num…

dbeaver工具连接达梦数据库

、一 概述 DBeaver 是一个基于 Java 开发,免费开源的通用数据库管理和开发,DBeaver 采用 Eclipse 框架开发,支持插件扩展,并且提供了许多数据库管理工具:ER 图、数据导入/导出、数据库比较、模拟数据生成等&#xff0…

DBeaver 格式化sql

有时候我们拿到了一条sql语句是长长的,非常不容易阅读,这时我们就想说哪里可以格式下sql代码。 方法有很多种,这里我就用Dbeaver来格式化sql。 ①打开Dbeaver ②复制sql代码到SQL编辑器中,并选中 ③按ctrlshiftF,即…

【DBeaver】常用自定义设置

文章目录 背景一、用户界面设置1.1、22.3.4版本1.1.1、SQL编辑器-字体设置1.1.2、查询结果-字体设置 1.2、23.0.0版本1.2.1、应用字体(导航栏等)1.2.2、文本字体(SQL输出、文本编辑器等) 二、常规设置2.1、连接类型设置/环境设置 …

DBeaver导入Excel数据

目录 前言 导入准备 ​导入步骤 1.选中数据库表,右键,然后点击导入数据 2.双击CSV,选择待导入的文件 3.修改编码格式(可选,不乱码不用) 4.点击下一步,修改列的类型 5.一直下一步,点击…

Dbeaver基本使用

1:与plsql相比,Dbeaver没有右击直接查看表注释的功能,但是Dbeaver提供了一个“打开声明”的功能,里面可以查看一些比较实用的内容:表列注释、创建该表的create语句: 2:在一般开发的情况下&#…

【大数据】Hive可视化工具dbeaver

Hive可视化工具dbeaver 1、dbeaver基本介绍 dbeaver是一个图形化的界面工具,专门用于与各种数据库的集成,通过dbeaver我们可以与各种数据库进行集成通过图形化界面的方式来操作我们的数据库与数据库表,类似于我们的sqlyog或者navicat。 2、…

DBeaver安装及使用手册

一、DBeaver安装 1、在[DBeaver官网](https://dbeaver.io/download)进行数据库工具下载,下载好后双击运行2、选择语言后,点击OK 3、点击下一步 4、接受许可 5、选择可使用者,然后点击下一步 6、选择组件,一般选择默认即可 7…