首页 > 系统相关 >25.Java JUC 引入(进程与线程、线程的状态、并发与并行、管程、用户线程与守护线程)

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

时间:2025-01-03 23:35:14浏览次数:3  
标签:25 Java Thread 管程 并发 线程 进程 执行

一、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,Thread,管程,并发,线程,进程,执行
From: https://blog.csdn.net/weixin_52173250/article/details/144919863

相关文章

  • java对象与map之间互转操作的八种姿势
    Java将对象转为Map,可以采用的八种操作姿势,按顺序推荐选择,推荐前三势好用又方便。提示:如果Map转换对象失败或为空,取消对象的lombok方式,用set/get方法一势Fastjson操作转换Fastjson阿里巴巴的一个开源JSON库,性能极快,支持JSON与Collection、Map、JavaBean之间的转换,并且......
  • 2025-01-03 Wireshark_HTTP_v7.0 1-2节
    这是一个基于数据包的网络分析问题。以下是通过分析提供的数据包内容得出的答案:2.Whatlanguages(ifany)doesyourbrowserindicatethatitcanaccepttotheserver?该问题通常通过查看Accept-LanguageHTTP头部字段来回答,但在提供的数据包中没有看到Accept-Languag......
  • java反射 -2025/1/3
    以下是java.lang.reflect包中的主要类和接口的详细介绍:Class类功能:表示类的对象,提供了获取类信息的方法,如字段、方法、构造函数等。主要方法:getFields():获取所有公共字段。getDeclaredFields():获取所有声明的字段,包括私有字段。getMethods():获取所有公共方法。getDecla......
  • 2024年回顾与2025年展望
    本来打算元旦来做一下本人的年度总结的,但是元旦那天只有一天假,并且那天带孩子出去玩了,总结就耽搁了。这篇总结是自己断断续续靠晚上下班回来,老婆孩子睡着之后以及上班摸鱼时间写出来的2024年回顾本年度总结我继续从生活、学习以及工作上来进行回顾。首先是生活上,今天孩子开始在......
  • 2025 01 做题笔记
    0102MX省选模拟赛Day8,\(63+100+0\),rk5,T1想到了几乎所有转化,还是死在了最后一步找支配对,我以为这没啥性质的。T上了,P呢?P4482[BJWC2018]Border的四种求法:学习了一种很厉害的单logborderseries做法,但是太难写了,还是用SAM吧,我们要做的就是对r对应的节点找一......
  • Java 面向对象-封装
    何为封装(Encapsulation)面向对象的开发原则为“高内聚,低耦合”,即类的内部数据操作细节自己完成,不允许外部干涉,仅暴露少量方法给外部调用使用。例如,开车,我们无需懂得油门、离合、变速箱也可以驾驶。封装性本质是解耦(decouple)的表现在JAVA中,实现封装就是控制类或成员的可见范......
  • Diary - 2025.01.03
    今天简直是唐完了,糖糖。晚上想啥啥不会,看了题解还写不出来。我去我是不是没救了???今天的事没有办法,就鸽到明天去吧(。whk结束啦!!!看来pku还是挺良心的,有优异的还能直接打,太感动了!!!比较意外的是我居然去年pkusc也是优异,毕竟我觉得那场打的还是有点差的(。明天看起来是没有模......
  • Java毕业设计基于SpringBoot+Vue甜品店管理系统
    一、项目介绍开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven————————————————二、功能介绍1.高效的用户界面开发1.Vue是一个渐进式JavaScript框架,用于构......
  • 使用 Selenium IDE 生成 Java 自动化测试代码
    首先使用SeleniumIDE录制操作。导出为JavaJUnit测试文件。创建Maven项目,并编辑pom.xml添加依赖:我使用的SeleniumIDE版本为3.17.2,其对应的JUnit版本为4.x.x。<projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/200......
  • 【职业规划】2025职业规划:行动力
    原创职场智汇堂......