多线程进阶知识篇(二)

news2025/7/10 0:45:16

文章目录

  • 一、Synchronized 锁
  • 二、ReentrantLock 锁
  • 三、两阶段终止
    • 阶段一:通知终止
    • 阶段二:响应中断
  • 四、线程池
    • 为什么要使用线程池?
    • 如何创建线程池?
      • Executors
      • ThreadPoolExecutor
    • 线程池的基本参数
  • 五、线程池处理任务的流程


一、Synchronized 锁

synchronized 是 Java关键字,用于修饰方法或代码块,属于重量级锁,主要是在多线程环境下实现对共享资源的互斥访问。
基本使用

public class SynchronizedExample {
    public synchronized void method1() {
        // 修饰实例方法,锁的是当前对象实例
    }

    public static synchronized void method2() {
        // 修饰静态方法,锁的是当前类的 Class 对象
    }

    public void method3() {
        synchronized (this) {
            // 代码块锁,锁的是当前对象
        }
    }
}

synchronized 可以保证数据的可见性和原子性,支持可重入和自动释放锁,但是不支持超时锁和中断等操作。


二、ReentrantLock 锁

ReentrantLock 是 JDK 1.5 引入的可重入锁,属于轻量级锁,相比 synchronized 增加了超时、中断、公平锁等高级功能。
基本使用

public class ReentrantLockExample {
    private final ReentrantLock lock = new ReentrantLock();
    public void method() {
        lock.lock();
        try {
            // 临界区
        } finally {
            lock.unlock(); 
        }
    }
}

ReentrantLock 支持可重入、可中断、超时机制和条件变量,但是加锁需要手动释放,否则可能造成死锁。


三、两阶段终止

两阶段终止模式: 是指优雅地中止线程的方式。

阶段一:通知终止

线程通过 interrupt() 设置中断标志,告知目标线程终止。

阶段二:响应中断

线程检测到中断标志(或抛出中断异常),执行清理工作后安全退出。

class Main extends Thread {
      public void run() {
          while (!Thread.currentThread().isInterrupted()) {
              try {
                  Thread.sleep(1000);
              } catch (InterruptedException e) {
                  break; // 退出循环
              }
          }
      }
  }

四、线程池

为什么要使用线程池?

  • 提高响应速度
  • 减少资源消耗
  • 易于管理线程

如何创建线程池?

Executors

  1. 无限线程数的线程池
ExecutorService threadPool = Executors.newCachedThreadPool();
  1. 固定线程的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(10);
  1. 单一线程的线程池
ExecutorService threadPool = Executors.newSingleThreadExecutor();

ThreadPoolExecutor

ExecutorService pool = new ThreadPoolExecutor(
    2,
    5,
    10,
    TimeUnit.SECONDS,
    new ArrayBlockingQueue<>(10),
    Executors.defaultThreadFactory(),
    new ThreadPoolExecutor.AbortPolicy()
);
pool.execute(() -> {
        System.out.println(Thread.currentThread().getName() + " 执行任务:");
    });
pool.shutdown(); 

线程池的基本参数

ThreadPoolExecutor(
    int corePoolSize,      // 核心线程数
    int maximumPoolSize,   // 最大线程数
    long keepAliveTime,    // 空闲线程存活时间
    TimeUnit unit,         // 时间单位
    BlockingQueue<Runnable> workQueue, // 任务队列
    ThreadFactory threadFactory,       // 线程工厂
    RejectedExecutionHandler handler   // 拒绝策略
)

五、线程池处理任务的流程

在这里插入图片描述

  1. 如果当前线程数 < 核心线程数,则创建一个线程执行任务。
  2. 如果核心线程数 <= 当前线程数 < 最大线程数并且阻塞队列未满,则线程进入阻塞队列等待。
  3. 如果阻塞队列已满但是当前线程数 < 最大线程数,则创建一个线程执行任务。
  4. 如果当前线程数等于最大线程数,则根据拒绝策略处理该线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337401.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python深度学习基础——深度神经网络(DNN)(PyTorch)

张量 数组与张量 PyTorch 作为当前首屈一指的深度学习库&#xff0c;其将 NumPy 数组的语法尽数吸收&#xff0c;作为自己处理张量的基本语法&#xff0c;且运算速度从使用 CPU 的数组进步到使用 GPU 的张量。 NumPy 和 PyTorch 的基础语法几乎一致&#xff0c;具体表现为&am…

简单实现单点登录

单点登录 单点登录&#xff08;Single Sign-On, SSO&#xff09; SSO是一种统一身份认证技术&#xff0c;用户只需在认证平台登录一次&#xff0c;即可访问所有关联的应用程序或网站&#xff0c;无需重复输入凭据。例如&#xff0c;企业员工登录内部系统后&#xff0c;可直接…

02、GPIO外设(一):基础知识

基础知识 1、ZET6的引脚分布2、引脚输出3、引脚输入4、最大输出速度 1、ZET6的引脚分布 下面使用C8T6的引脚来类比ZET6的引脚&#xff0c;ZET6中的特殊功能引脚和C8T6的特殊功能引脚是一样。而通用IO引脚比C8T6多而已。下面的C8T6的特殊功能引脚的介绍&#xff1a; STM32F103C8…

智能Todo协作系统开发日志(二):架构优化与安全增强

&#x1f4c5; 2025年4月14日 | 作者&#xff1a;Aphelios380 &#x1f31f; 今日优化目标 在原Todo单机版基础上进行三大核心升级&#xff1a; 组件化架构改造 - 提升代码可维护性 本地数据加密存储 - 增强隐私安全性 无障碍访问支持 - 践行W3C标准 一、组件化架构改造 …

【C++初阶】第14课—缝合怪deque和优先队列、仿函数

文章目录 1. 双端队列deque1.1 认识deque1.2 deque的迭代器1.3 deque的常用接口1.4 deque的优缺点 2. 优先队列priority_queue2.1 认识priority_queue2.2 模拟实现优先队列priority_queue 3. 仿函数 在学习deque之前&#xff0c;回顾一下vector和list各自的优缺点 数据结构优点…

方德桌面操作系统V5.0-G23安装Docker并配置DockerHub镜像加速器

为什么要使用debina的docker源&#xff0c;因为查询os-release和uname 显示是基于debina 11的操作系统 rootyuhua-virtualmachine:~# cat /etc/os-release NAME"方德桌面操作系统" NAME_EN"NFSDesktop" VERSION"5.0" VERSION_ID"5.0"…

紫光同创FPGA实现HSSTLP光口视频点对点传输,基于Aurora 8b/10b编解码架构,提供6套PDS工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐我已有的所有工程源码总目录----方便你快速找到自己喜欢的项目紫光同创FPGA相关方案推荐我这里已有的 GT 高速接口解决方案Xilinx系列FPGA实现GTP光口视频传输方案推荐Xilinx系列FPGA实现GTX光口视频传输方案推荐Xilinx系列FPGA实…

数字孪生城市技术应用典型实践案例汇编(22个典型案例)(附下载)

近年来&#xff0c;数字孪生技术在我国从战略框架逐步向系统性落地推进&#xff0c;成为推动数字中国建设的重要技术引擎。随着《数字中国建设整体布局规划》《"十四五"数字经济发展规划》《深化智慧城市发展推进城市全域数字化转型的指导意见》等政策的实施&#xf…

Hyperf (Swoole)的多进程 + 单线程协程、Gin (Go)Go的单进程 + 多 goroutine 解说

1. 核心概念解析 (1) Hyperf (Swoole): 多进程 单线程协程 Swoole 并发模型详解 Swoole 的并发模型基于多进程架构&#xff0c;每个进程是单线程的&#xff0c;线程内运行多个协程。以下是其结构的关键点&#xff1a; 多进程&#xff1a;Swoole 应用程序启动时&#xff0c;…

Intel(R) Wi-Fi 6 AX201 160MHz

本文来源 &#xff1a; 腾讯元宝 ​​Intel(R) Wi-Fi 6 AX201 160MHz​​ 是一款支持最新 Wi-Fi 6&#xff08;802.11ax&#xff09;标准的无线网卡&#xff0c;专为现代笔记本电脑和台式机设计。以下是其主要特点和规格&#xff1a; ​​主要特性&#xff1a;​​ ​​Wi-Fi …

Java 工厂设计模式详解:用统一入口打造灵活可扩展的登录系统----掌握 Spring 源码的基础第一步

一、前言 在实际开发中&#xff0c;我们经常面临以下场景&#xff1a; 系统支持多种登录方式&#xff08;用户名密码、管理员登录、OAuth 登录、短信登录等&#xff09; 每种登录方式的认证逻辑不同 我们希望对外提供一个统一的接口调用&#xff0c;而不暴露具体实现 这个…

Spring Boot管理Spring MVC

Spring Boot真正的核心功能是自动配置和快速整合&#xff0c;通常Spring Boot应用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web启动器嵌入了Spring MVC的依赖&#xff0c;并为Spring MVC提供了大量自动配置&#xff0c;可以适用于大多数Web开发…

Windows单机模拟MySQL主从复制

这里写自定义目录标题 下载MySQL ZIP压缩包安装主库1、创建配置文件2、安装服务3、初始化数据库4、启动服务5、配置主库 安装从库1、配置ini文件2、安装服务3、初始化数据库4、启动服务5、配置从库6、验证从库状态 操作主库验证 下载MySQL ZIP压缩包 https://dev.mysql.com/do…

Wifi密码查看软件V1.0

⭐本软件用于查看电脑连接过所有WiFi密码&#xff0c;不具备破解功能。 可在忘记WiFi密码或他人输入密码自己不知道的情况下使用。 ⭐⭐为便于快速分享&#xff0c;加入双击【密码】列可将WIFI密码复制在粘贴板。 ⭐⭐⭐双击【名称】列可生成用于手机连接的二维码进行显示&…

分布式日志治理:Log4j2自定义Appender写日志到RocketMQ

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

【口腔粘膜鳞状细胞癌】文献阅读3

文献 Single-cell transcriptomic analysis uncovers the origin and intratumoral heterogeneity of parotid pleomorphic adenoma 单细胞转录组学分析揭示了腮腺多形性腺瘤的起源和瘤内异质性 IF:10.8中科院分区:1区 医学WOS分区:Q1 摘要 多形性腺瘤 &#xff08;PA&#…

RL中的rollout和episode的区别请问是啥

很好的问题兄弟&#xff0c;rollout 和 episode 在强化学习&#xff08;RL&#xff09;里经常一起出现&#xff0c;虽然有重叠&#xff0c;但含义和使用语境还是有区别的&#xff1a; ✅ 一句话总结&#xff1a; Episode 是一个完整的任务过程&#xff08;从起点到终点&#xf…

个人博客系统后端 - 用户信息管理功能实现指南(上)

本文记录了如何实现用获取户信息&#xff0c;用户信息更新&#xff0c;用户头像上传三大基础功能 先上接口实现截图&#xff1a; 一、项目结构概览 先介绍一下 个人博客系统采用了标准的 Spring Boot 项目结构&#xff0c;用户功能相关的文件主要分布在以下几个目录&#xff1a…

具身智能机器人学习路线全解析

一、引言 具身智能机器人作为融合了机器人学、人工智能、认知科学等多领域知识的前沿技术&#xff0c;正逐渐改变着我们的生活和工作方式。从工业制造到家庭服务&#xff0c;从医疗护理到太空探索&#xff0c;具身智能机器人都展现出了巨大的潜力。对于想要深入了解和学习这一…

写项目时一些疑惑:组件间的通信、createDownloadUrl和DownloadUrl,ArrayBuffer与Blob等

目录 一、[vite] Internal server error: No known conditions for "./lib/locale/lang/zh-cn" specifier in "element-plus" package 二、可以用vue和JS的代码片段,但是用不了html的代码片段 三、meta是什么东西 四、为什么代码保持一致,但是时间轴始…