当前位置: 首页 > news >正文

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介

  • JUC 是 java.util.concurrent 工具包的简称,这是一个处理线程的工具包,从 JDK1.5 开始出现

二、进程与线程

1、基本介绍
(1)进程
  • 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

  • 在当代面向线程设计的计算机结构中,进程是线程的容器

  • 程序是指令、数据及其组织形式的描述,进程是程序的实体

(2)线程
  • 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位

  • 一个线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务

(3)小结
  • 进程指在系统中正在运行的一个应用程序,程序一旦运行就是进程,是资源分配的最小单位

  • 线程是系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流,是程序执行的最小单位

2、线程的状态
(1)线程状态枚举类
  • Thread.State 类
public enum State {// 新建NEW,// 准备就绪RUNNABLE,// 阻塞BLOCKED,// 等待WAITING,// 定时等待TIMED_WAITING,// 终结TERMINATED;
}
(2)wait 和 sleep 方法的区别
  • sleep 方法是 Thread 的静态方法,wait 方法是 Object 的方法,任何对象实例都能调用

  • sleep 方法执行时不会释放锁,也不需要占用锁,wait 方法执行会释放锁,但调用它的前提是当前线程占有锁

  • wait 和 sleep 方法都可以被 interrupted 方法中断

  • wait 和 sleep 方法在进入等待睡眠,就会在哪里被唤醒

3、并发与并行
(1)串行
  • 串行表示所有任务都一一按先后顺序进行

  • 串行一次只能取得一个任务,并执行这个任务

(2)并行
  • 并行可以同时取得多个任务,并同时去执行所取得的这些任务

  • 并行的效率从代码层次上强依赖于多进程 / 多线程代码,从硬件角度上依赖于多核 CPU

(3)并发
  • 并发指的是多个程序可以同时运行的现象,更细化则是多进程可以同时运行或者多指令可以同时运行

  • 但这不是重点,在描述并发的时候也不会去扣这种字眼是否精确,并发的重点在于它是一种现象,并发描述的是多进程同时运行的现象

  • 但实际上,对于单核 CPU 来说,同一时刻只能运行一个线程,所以,这里的“同时运行”表示的不是真的同一时刻有多个线程运行的现象(这是并行的概念),而是提供一种功能让用户看起来多个程序同时运行起来了,但实际上这些程序中的进程不是一直霸占 CPU 的,而是执行一会停一会

  • 要解决大并发问题,通常是将大任务分解成多个小任务, 由于操作系统对进程的调度是随机的,所以切分成多个小任务后,可能会从任一小任务处执行,这可能会出现一些现象

    • 可能出现一个小任务执行了多次,还没开始下个任务的情况,这时,一般会采用队列或类似的数据结构来存放各个小任务的成果

    • 可能出现还没准备好第一步就执行第二步的情况,这时,一般采用多路复用或异步的方式,比如只有准备好产生了事件通知才执行某个任务

    • 可以用多进程 / 多线程的方式并行执行这些小任务,也用可以单进程 / 单线程执行这些小任务,这时很可能要配合多路复用才能达到较高的效率

(4)小结
  • 并行:多项工作一起执行,之后再汇总

    • 例子:泡方便面,一边电水壶烧水,一边撕调料
  • 并发:同一时刻多个线程访问同一个资源,多个线程对一个点

    • 例子:春运抢票、电商秒杀
4、管程
  • 管程(Monitor,监视器,即锁)是保证同一时刻只有一个进程在管程内活动,即管程内定义的操作在同一时刻只被一个进程调用(由编译器实现),但是这样并不能保证进程以设计的顺序执行

  • JVM 中同步是基于进入和退出管程对象实现的,每个对象都会有一个管程对象,管程会随着 Java 对象一同创建和销毁

  • 执行线程首先要持有管程对象,然后才能执行方法,当方法完成之后会释放管程,方法在执行时候会持有管程,其他线程无法再获取同一个管程

5、用户线程与守护线程
(1)基本介绍
  • 用户线程:平时用到的普通线程,自定义线程

  • 守护线程:运行在后台,一种特殊的线程,比如垃圾回收

(2)演示
  • 当主线程结束后,用户线程还在运行,JVM 仍然存活
new Thread(() -> {System.out.println(Thread.currentThread().getName() + " 是否是守护线程 " + Thread.currentThread().isDaemon());while (true) {}
}, "myThread").start();System.out.println(Thread.currentThread().getName() + " 结束");
  • 如果没有用户线程,都是守护线程时,JVM 结束
Thread myThread = new Thread(() -> {System.out.println(Thread.currentThread().getName() + " 是否是守护线程 " + Thread.currentThread().isDaemon());while (true) {}
}, "myThread");// 设置守护线程
myThread.setDaemon(true);
myThread.start();System.out.println(Thread.currentThread().getName() + " 结束");

相关文章:

25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

一、JUC 简介 JUC 是 java.util.concurrent 工具包的简称,这是一个处理线程的工具包,从 JDK1.5 开始出现 二、进程与线程 1、基本介绍 (1)进程 进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源…...

Linux 异步 I/O 框架 io_uring:基本原理、程序示例与性能压测

大家觉得有意义和帮助记得关注和点赞!!! io_uring 是 2019 年 Linux 5.1 内核首次引入的高性能 异步 I/O 框架,能显著加速 I/O 密集型应用的性能。 但如果你的应用已经在使用 传统 Linux AIO 了,并且使用方式恰当&…...

Uniapp中使用`wxml-to-canvas`开发DOM生成图片功能

Uniapp中使用wxml-to-canvas开发DOM生成图片功能 在移动端开发中,生成图片是一个常见需求,例如用于分享海报、生成动态二维码等。在Uniapp框架中,我们可以通过wxml-to-canvas插件轻松实现将DOM转化为图片的功能。本文将详细介绍如何在Uniapp…...

Linux之ARM(MX6U)裸机篇----5.仿stm32的LED驱动实验

一,启动文件 .global _start .global _bss_start /* 类似宏定义把__bss_start定义为_bss_start */ _bss_start:.word __bss_start.global _bss_end _bss_end:.word __bss_end_start:#设置处理器进入SVC模式mrs r0, cpsr /* 读取cpsr到r0 */bic r0, r0, …...

DVWA靶场Open HTTP Redirect (重定向) 漏洞所有级别通关教程及源码审计

目录标题 Open HTTP Redirectlow源码审计 medium源码审计 high源码审计 impossible源码审计 Open HTTP Redirect HTTP 重定向(HTTP Redirect Attack)是一种网络,利用 HTTP 协议中的重定向机制,将用户引导至恶意网站或非法页面&am…...

探索 JMeter While Controller:循环测试的奇妙世界

嘿,宝子们!今天咱们就来聊聊 JMeter 里超级厉害的 While 控制器,它就像是一把神奇的钥匙,能帮我们打开循环测试的大门,模拟出各种各样复杂又有趣的场景哦! 一、While 控制器初印象 想象一下,你…...

Flutter踩坑记-第三方SDK不兼容Gradle 8.0,需适配namespace

最近需要集成Flutter作为Module,Flutter依赖了第三方库,Gradle是8.0版本。 编译报错: 解决办法是在.android根目录下的build.gradle下新增一行代码: buildscript {ext.kotlin_version "1.8.22"repositories {google()…...

ubuntu支持ssh

Ubuntu 默认是支持 SSH 的,但通常并不会在安装时启用 SSH 服务。为了能够远程连接到 Ubuntu 系统,需要安装并启动 SSH 服务器(即 OpenSSH)。以下是如何在 Ubuntu 系统中启用和配置 SSH 服务的步骤: 检查 SSH 是否已安…...

浏览器书签智能分类

浏览器书签智能分类工具 最近发现浏览器的书签越来越乱了,主要是因为自己太懒,其次之前建的分类太多又乱,重新手动整理确实比较烦。因此有了这个小项目。借助智谱AI的力量对书签进行重新分类。 项目简介 本工具用于自动整理浏览器书签&…...

通俗易懂的讲一下Vue的双向绑定和React的单向绑定

1.Vue 的双向绑定&#xff1a; <template><!-- 输入框和数据自动绑定&#xff0c;就像连体婴儿&#xff0c;一个动另一个也动 --><input v-model"message"><p>{{ message }}</p><!-- 完整表单示例 --><form><!-- 所有…...

Redis 深度解析:从入门到精通

引言 Redis 是一个开源的、高性能的键值存储系统&#xff0c;它支持多种数据结构&#xff0c;并且提供了丰富的功能和接口。作为内存数据库&#xff0c;Redis 以其快速的数据访问速度、灵活的数据模型以及持久化选项而闻名。本文将详细介绍 Redis 的核心概念、工作原理及其应用…...

基于物联网的冻保鲜运输智能控制系统

基于物联网的冻保鲜运输智能控制系统设计文档 1. 项目开发背景 随着全球化贸易的发展&#xff0c;冷链物流在现代运输行业中扮演着日益重要的角色。尤其是冻品、食品、药品等对运输环境有着严格要求的货物&#xff0c;其运输过程中温度、湿度等环境参数必须严格控制&#xff…...

【深度学习基础之多尺度特征提取】多尺度卷积神经网络(MS-CNN)是如何在深度学习网络中提取多尺度特征的?附代码(二)

【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度学习网络中提取多尺度特征的&#xff1f;附代码&#xff08;二&#xff09; 【深度学习基础之多尺度特征提取】多尺度卷积神经网络&#xff08;MS-CNN&#xff09;是如何在深度…...

论文解读之learning to summarize with human feedback

最近在看大模型训练相关的论文&#xff0c;预计会追溯经典的和最新的训练策略以及微调原理等 本次解读经典论文learning to summarize with human feedback 一、简介 部分生成任务需要对齐人类偏好&#xff0c;但是根据最大化可能性&#xff08;对数似然&#xff09;进行微调…...

STM32学习(六 )

串口初始化IO引脚 串口的引脚在哪里 串口可以利用GPIO_InitTypeDef结构体和GPIO_Init&#xff08;&#xff09;函数进行初始化 USART_InitTypeDef USART_InitStruct;//建立串口结构体USART_InitStruct.USART_BaudRate 115200;//波特率115200USART_InitStruct.USART_Mode US…...

基于 GitHub API 的 Issue 和 PR 自动化解决方案

文章目录 摘要引言优化 Issue 和 PR 管理的方法工具选择流程优化 自动化 Issue 和 PR 管理代码逻辑详解获取 Issue 数据为 Issue 添加标签将 Issue 分配给开发者主逻辑 实际运行效果进一步扩展QA 环节总结参考资料 摘要 在开源项目中&#xff0c;Issue 和 Pull Request&#x…...

56.在 Vue 3 中使用 OpenLayers 通过 moveend 事件获取地图左上和右下的坐标信息

前言 在现代 Web 开发中&#xff0c;地图应用越来越成为重要的组成部分。OpenLayers 是一个功能强大的 JavaScript 地图库&#xff0c;它提供了丰富的地图交互和操作功能&#xff0c;而 Vue 3 是当前流行的前端框架之一。在本篇文章中&#xff0c;我们将介绍如何在 Vue 3 中集…...

文件本地和OSS上传

这里写目录标题 前端传出文件后端本地存储阿里云OSS存储上传Demo实现上传ConfigurationProperties 前端传出文件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>上传文件</title> </head&g…...

elementui table 表格 分页多选,保持选中状态

elementui多选时分页&#xff0c;解决选中状态无法保留选中项问题&#xff1a; 在el-table标签中加入row-key&#xff0c;row-key的值取当前数据里的唯一key在el-table-column selection 项中加入以下:reserve-selection“true” 完成后&#xff0c;将需要清空的地方 ( 如返回…...

MSE+Range案例

MSE的demo实现思路&#xff1a;首先准备fmp4格式的视频地址或者切片&#xff0c;接着将MSE挂载到video上&#xff0c;创建createObjectURL转二进制数据&#xff0c;fetch请求在线地址&#xff0c;分段请求&#xff0c;监听这个数据流的获取状态&#xff0c;当这个ReadyState为o…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

spring Security对RBAC及其ABAC的支持使用

RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型&#xff0c;它将权限分配给角色&#xff0c;再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...

面试高频问题

文章目录 &#x1f680; 消息队列核心技术揭秘&#xff1a;从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"&#xff1f;性能背后的秘密1.1 顺序写入与零拷贝&#xff1a;性能的双引擎1.2 分区并行&#xff1a;数据的"八车道高速公路"1.3 页缓存与批量处理…...

图解JavaScript原型:原型链及其分析 | JavaScript图解

​​ 忽略该图的细节&#xff08;如内存地址值没有用二进制&#xff09; 以下是对该图进一步的理解和总结 1. JS 对象概念的辨析 对象是什么&#xff1a;保存在堆中一块区域&#xff0c;同时在栈中有一块区域保存其在堆中的地址&#xff08;也就是我们通常说的该变量指向谁&…...

Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解

文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一&#xff1a;HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二&#xff1a;Floyd 快慢指针法&#xff08;…...