【Java】JUC并发编程-进程线程

news2024/11/23 15:18:55

目录

  • 一、什么是JUC
  • 二、进程和线程
    • 1、进程
    • 2、线程
  • 三、线程的六种状态
  • 四、wait与sleep的区别
  • 五、并发与并行
    • 1、串行模式
    • 2、并行模式
    • 3、并发模式
    • 4、管程
  • 六、用户线程与守护线程
    • 1、用户线程(自定义线程)
    • 2、守护线程(比如垃圾回收)

一、什么是JUC

JUC是java.util.concurrent包的简称,在Java5.0添加,目的就是为了更好的支持高并发任务。让开发者进行多线程编程时减少竞争条件和死锁的问题!

二、进程和线程

一个进程中有多个线程

1、进程

进程是资源分配的最小单位

指在系统中正在运行的一个应用程序,程序一旦运行就是进程

2、线程

线程是程序执行的最小单位

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

三、线程的六种状态

public enum State {
    // 新生
    NEW,

    // 运行
    RUNNABLE,

    // 阻塞
    BLOCKED,

    // 等待
    WAITING,

    //超时等待
    TIMED_WAITING,

    //终止
    TERMINATED;
}

四、wait与sleep的区别

  • sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用
  • sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)
  • 二者都可以被interrupted方法中断

五、并发与并行

并发:同一时刻多个线程在访问同一资源,多个线程对一个点
并行:多项工作一起执行,之后再汇总

1、串行模式

串行表示所有任务有一一按先后顺序进行。串行意味着必须先装完一车柴才能运送这车柴,只有运送到了,才能卸下这车柴,并且只有完成了这整个三个步骤,才能进行下一个步骤。

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

2、并行模式

并行意味着可以同时取得多个任务,并同时去执行所取得的这些任务。并行模式相当于将长长的一条队列,划分成了多条短队列,所以并行缩短了任务队列的长度。并行的效率从代码层次上强依赖于多线程/多线程代码,从硬件角度上则依赖于多核CPU

3、并发模式

并发指的是多个程序可以同时运行的现象,更细化的是多线程可以同时运行或者多指令可以同时运行

4、管程

管程(Monitor):在Java中称之为“锁”,在操作系统中称之为“监视器”。是一种同步机制,保证同一个时间,只有一个线程访问被保护的数据或者代码。
jvm同步基于进入和退出的过程中进行操作的,而进入和退出是使用管程对象实现的。每个对象都会有一个Monitor管程对象。而管程对象是会随着Java对象一起创建和销毁。

通俗来说的话就是:管程对象就是对我们的临界区进行加锁,进入时加锁,退出时解锁。进入退出通过管程对象进行管理

六、用户线程与守护线程

1、用户线程(自定义线程)

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        //isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
        System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
        while (true) {

        }
    }, "thread");

    thread.start();
    System.out.println(Thread.currentThread().getName()+" over");
}

执行结果:主线程结束了,用户线程还在运行,说明jvm是存活的一个状态

在这里插入图片描述

2、守护线程(比如垃圾回收)

public static void main(String[] args) {
    Thread thread = new Thread(() -> {
        //isDaemon()表示是用户线程还是守护线程,如果值为true,则为守护线程,如果值为false,则为用户线程
        System.out.println(Thread.currentThread().getName() + "::" + Thread.currentThread().isDaemon());
        while (true) {

        }
    }, "thread");

    //设置守护线程
    //用户线程包括守护线程,在设置用户线程包括守护线程的时候,要写在start()方法之前
    thread.setDaemon(true);

    thread.start();
    System.out.println(Thread.currentThread().getName()+" over");
}

执行结果:没有用户线程了,都是守护线程,说明jvm结束

在这里插入图片描述

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

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

相关文章

怎么来说?学习HashSet类

与这道题相关 》 345. 反转字符串中的元音字母 目录 一、HashSet是什么? 二、使用步骤 总结 一、HashSet是什么? HashSet是基于HashMap来实现的,实现了Set接口,同时还实现了序列化和可克隆化。而集合(Set&#xff…

为什么程序员不喜欢写注释?

现在的项目开发里,代码注释就像程序员的头发,越来越少。 尤其是国内,这种现象不仅是在小公司小团队中司空见惯,就算在大公司,以及大团队中的开源项目里,也是屡见不鲜。 上图是我在阿里的 Druid 项目源码里…

SQL-每日一题【626.换座位】

题目 表: Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例 1: 解题思路 前置知识 MySQL 的 MOD() 函数是取模运算的函数,它返回两个数相除…

el-popover 的content内容换行

需求&#xff1a;把el-popover的content内容进行换行 <el-popoverplacement"bottom"width"450"trigger"click"><div class"custom-content">示例&#xff1a;如果您在 2 个托盘上运输 40 箱纸&#xff08;每个托盘上20 箱…

基于SpringBoot+Vue的“智慧食堂”系统设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

三、Web安全相关知识

请勿用于非法用途 文章目录 一、Web源码框架二、目录结构1、静态资源2、WEB-INF&#xff08;1&#xff09;classes&#xff08;2&#xff09;lib&#xff08;3&#xff09;web.xml 二、web脚本语言1、脚本种类&#xff08;1&#xff09;ASP&#xff08;2&#xff09;ASP.NET&am…

Vue的下载以及MVVM分析

&#x1f600;前言本片文章是vue系列第一篇整理了vue的基础和发展史 &#x1f3e0;个人主页&#xff1a;尘觉主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是尘觉&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动力&#x1f609;&#x1f6…

服务器——Nginx安装及静态配置、部署

目录 Nginx 安装Nginx步骤 安装yum-utils 配置nginx.repo源 安装nginx 系统启动nginx服务器 nginx.conf配置 关闭nginx服务器 配置文件启动nginx服务 配置文件编写 启动nginx服务 关闭nginx服务 服务器——Nginx安装及静态配置、部署。 直接在云服务器中启动项目&…

【C# 数据结构】Heap 堆

【C# 数据结构】Heap 堆 先看看C#中有那些常用的结构堆的介绍完全二叉树最大堆 Heap对类进行排序实现 IComparable<T> 接口 对CompareTo的一点解释 参考资料 先看看C#中有那些常用的结构 作为 数据结构系类文章 的开篇文章&#xff0c;我们先了解一下C# 有哪些常用的数据…

Android开发之Fragment动态添加与管理

文章目录 主界面布局资源两个工具Fragment主程序 主界面布局资源 在activity_main.xml中&#xff0c;声明两个按钮备用&#xff0c;再加入一个帧布局&#xff0c;待会儿用来展示Fragment。 <?xml version"1.0" encoding"utf-8"?> <LinearLayo…

一文快速入门任务调度框架-Quartz

前言 还不会 Quartz&#xff1f;如果你还没有接触过Quartz&#xff0c;那么你可能错过了一个很棒的任务调度框架&#xff01;Quartz 提供了一种灵活、可靠的方式来管理和执行定时任务&#xff0c;让咱们的定时任务更加优雅。本篇文章将为你介绍 Quartz 框架的核心概念、API 和…

Vue3封装函数组件(ElImageViewer)预览图片

目录结构 index.vue <template><el-image-viewer v-if"show" v-bind"$attrs" hide-on-click-modal close"show false" /> </template><script setup> import { ref, watch } from "vue" import { ElImageV…

D2L学习记录-10-词嵌入word2vec

NLP-1-词嵌入(word2vec) 参考: 《动手学深度学习 Pytorch 第1版》第10章 自然语言处理 第1、2、3 和 4节 (词嵌入) 词嵌入 (word2vec)&#xff1a; 词向量&#xff1a;自然语言中&#xff0c;词是表义的基本单元。词向量是用来表示词的向量。词嵌入 (word embedding)&#x…

余切拉普拉斯算子推导 cotangent Laplace-Beltrami operator

欢迎关注更多精彩 关注我&#xff0c;学习常用算法与数据结构&#xff0c;一题多解&#xff0c;降维打击。 参考自polygon mesh proccessing这本书 基本思路及原理 余切拉普拉斯算子是一种考虑了网格底层几何联系的一种算子&#xff0c;在网格平滑&#xff0c;参数化等算法中…

no instance(s) of type variable(s) R exist so that void conforms to R 解决方法

一、问题描述 使用函数式编程stream().map()的时候报错&#xff1a; no instance(s) of type variable(s) R exist so that void conforms to R 二、报错原因 map()函数需要有一个返回值&#xff0c;但是setter方法返回值为void,即setChildren()返回值为void. 三、解决方法 …

SpringBoot前后端分离项目中实现将图片上传至Linux服务器(极简)

FileController /*** 文件上传至服务器 */ ApiOperation("文件上传") PostMapping("/upload") public R upload(MultipartFile file){String uploadUrl fileService.upload(file);return R.ok().message("文件上传成功").data("url",…

一遍看懂面试算法——二叉树

目录 二叉树的种类 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 二叉树的存储方式 二叉树的遍历方式 二叉树的递归遍历 二叉树的迭代遍历 前序遍历&#xff08;迭代法&#xff09; 中序遍历&#xff08;迭代法&#xff09; 后序遍历&#xff08;迭代法&#xff…

Python-如何使用正则表达式

如何利用Python使用正则表达式 目录 正则表达式常用匹配规则 ​编辑re库的使用 match()方法&#xff1a; search()方法: findall()方法 : sub()方法: compile()方法; 通用匹配 贪婪与非贪婪匹配 贪婪匹配 非贪婪匹配 修饰符 转义匹配 正则表达式是处理字符的强大…

高电压放大器ATA-2021B技术指标

随着ATA-2021H高压放大器的升级改版&#xff0c;新品ATA-2021B高电压放大器走进了更多工程师、研究人员的视野。相比于升级之前&#xff0c;ATA-2021B高压放大器拥有了更多更好地优势&#xff0c;可以更好地的帮助研究人员高效完成测试项目。今天Aigtek小编就带大家了解一下关于…

liunx时间慢几分钟,定时更新系统时间

#&#xff01;/bin/sh hwclock --hctosys echo "执行成功" 定时5分钟执行一次