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

news2025/1/6 19:20:50

一、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() + " 结束");

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

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

相关文章

AfuseKt1.4.4 | 刮削视频播放器,支持阿里云盘和自动海报墙

AfuseKt是一款功能强大的安卓端在线视频播放器,广泛兼容多种平台如阿里云盘、Alist、WebDAV、Emby、Jellyfin等,同时也支持本地存储视频文件的播放。其特色功能包括自动抓取影片信息生成海报墙展示,充分利用设备硬件进行高清视频流畅播放&…

Linux下部署ElasticSearch集群

Elasticsearch7.17.8集群的搭建 节点host名称节点ip节点部署内容k8s-m192.168.40.142主节点 数据节点k8s-w1192.168.40.141主节点 数据节点k8s-w2192.168.40.140数据节点 一、准备安装环境 1.下载安装包 官网 www.elastic.co 下载所有版本地址 点击跳转 下载elasticsearch-7.…

covid-vaccine-availability-using-flask-server

使用烧瓶服务器获得 Covid 疫苗 原文:https://www . geesforgeks . org/co vid-疫苗-可用性-使用-烧瓶-服务器/ 在本文中,我们将使用 Flask Server 构建 Covid 疫苗可用性检查器。 我们都知道,整个世界都在遭受疫情病毒的折磨,唯一能帮助我们…

线性变换在机器学习中的应用实例

一、线性变换的基本概念 线性变换是指将一个向量空间中的向量映射到另一个向量空间中的函数,这种映射关系保持向量加法和标量乘法的运算性质。在机器学习中,线性变换通常通过矩阵乘法来实现,其中输入向量被视为列向量,矩阵被视为…

【Linux】传输层协议UDP

目录 再谈端口号 端口号范围划分 UDP协议 UDP协议端格式 UDP的特点 UDP的缓冲区 UDP注意事项 进一步深刻理解 再谈端口号 在上图中,有两个客户端A和B,客户端A打开了两个浏览器,这两个客户端都访问同一个服务器,都访问服务…

大功率PCB设计

1.电源和电机的走线用线径较大的铺铜,讲究的是走线顺畅: 2.同一个电源属性四层板都铺铜,并打很多过孔: 3.走线顺畅,可以看到从左到右供电。从右向左接地,加电流采样: 一个问题,这样会形成电源环…

ArkTs之NAPI学习

1.Node-api组成架构 为了应对日常开发经的网络通信、串口访问、多媒体解码、传感器数据收集等模块,这些模块大多数是使用c接口实现的,arkts侧如果想使用这些能力,就需要使用node-api这样一套接口去桥接c代码。Node-api整体的架构图如下&…

Vue el-data-picker选中开始时间,结束时间自动加半小时

效果 思路 查阅elemnet plus官网,日期时间选择器type"datetimerange"这个选中开始时间并没有对应事件会被触发,因此思路更换成type"datetime"的两个组成一起可以通过监听开始时间v-model的值变化更新结束时间的值。 代码 日期时间…

gitlab高级功能之 CICD Steps

CICD Steps 1. 介绍2. 定义 Steps2.1 Inputs2.2 Outputs 3. Using steps3.1 Set environment variables3.2 Running steps locally 4. Scripts5. Actions5.1 已知的问题 6. 表达式7. 实操7.1 单个step7.2 多个step7.3 复用steps7.4 添加output到step7.5 使用远程step 1. 介绍 …

TVS二极管选型【EMC】

TVS器件并联在电路中,当电路正常工作时,他处于截止状态(高阻态),不影响线路正常工作,当线路处于异常过压并达到其击穿电压时,他迅速由高阻态变为低阻态,给瞬间电流提供一个低阻抗导通…

122.【C语言】数据结构之快速排序(Hoare排序的优化)

目录 1.解决方法(即优化方法) 方法1.随机选key 运行结果 方法2:三数取中 1.含义 2.做法 3.代码 1.若arr[left] < arr[mid_i],则arr[right]可能的位置也有三处 2.若arr[left] > arr[mid_i],则arr[right]可能的位置也有三处 2.证明当key_ileft时,right先走,使left…

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言&#xff0c;其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程&#xff0c;典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…

《Spring Framework实战》2:Spring快速入门

欢迎观看《Spring Framework实战》视频教程 Spring快速入门 目录 1. Java™开发套件&#xff08;JDK&#xff09; 2. 集成开发人员环境&#xff08;IDE&#xff09; 3. 安装Maven 4. Spring快速入门 4.1. 开始一个新的Spring Boot项目 4.2. 添加您的代码 4.3. 尝…

HTML——66.单选框

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>单选框</title></head><body><!--input元素的type属性&#xff1a;(必须要有)--> <!--单选框:&#xff08;如所住省会&#xff0c;性别选择&…

rouyi(前后端分离版本)配置

从gitee上下载&#xff0c;复制下载地址&#xff0c;到 点击Clone&#xff0c;下载完成&#xff0c; 先运行后端&#xff0c;在运行前端 运行后端&#xff1a; 1.配置数据库&#xff0c;在Navicat软件中&#xff0c;连接->mysql->名字自己起(rouyi-vue-blog),用户名roo…

基于云架构Web端的工业MES系统:赋能制造业数字化变革

基于云架构Web端的工业MES系统:赋能制造业数字化变革 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智…

如何解决电脑提示缺失kernel32.dll文件错误,kernel32.dll文件缺失、损坏或错误加载问题解决方案

电脑运行故障深度解析&#xff1a;从文件丢失到系统报错&#xff0c;全面应对kernel32.dll问题 在数字化时代&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的工具。然而&#xff0c;电脑在长时间运行过程中&#xff0c;难免会遇到各种问题&#xff0c;如文件丢失、文…

leecode300.最长递增子序列

dp[i]表示以nums[i]这个数结尾的时的严格递增子序列的最长长度&#xff0c;那么只要每次增加一个数字nums[i]并且这个nums[i]比之前的nums[j]要大&#xff0c;dp[i]就要更新为dp[i]和dp[j]1二者的最大值&#xff0c;初始化默认最大递增子序列都是1 这里遍历顺序的感觉很像多重…

termux配置nginx+php

只能以默认用户u0_axx运行,修改用户会报错An error occurred.或者file no found 安装nginx pkg install nginx安装php-fpm pkg install nginx修改nginx配置文件, nano ../usr/etc/nginx/nginx.conf#端口必须设置在1024以上(1024以下需要root,但php-fpm不能以root用户运行,n…

typescript安装后仍然不能使用tsc,如何解决

1.全局安装 npm i typescript -g 2.发现仍然不行 解决方法&#xff1a; C:\Users\你的用户名\AppData\Roaming\npm解决办法&#xff1a; 1.确定对应的文件下载了 我们发现typescript是下载了的 2.设置环境变量的path 路径为typescript下的npm 3.cmd运行