JUC入门 | 黑马

news2024/11/18 21:44:17

一、进程和线程

进程

程序由指令和数据组成,但这些指令要运行,数据要读写,就必须将指令加载至CPU,数据加载至内存。在指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管理内存、管理I0的
当一个程序被运行,从磁盘加载这个程序的代码至内存,这时就开启了一个进程
进程就可以视为程序的一个实例。大部分程序可以同时运行多个实例进程(例如记事本、画图、浏览器等),也有的程序只能启动一个实例进程(例如网易云音乐、360安全卫士等)

线程

一个进程之内可以分为一到多个线程
一个线程就是一个指令流,将指令流中的一条条指令以一定的顺序交给 CPU执行
Java 中线程作为最小调度单位,进程作为资源分配的最小单位。在windows 中进程是不活动的,只是作为线程的容器

二者对比

进程基本上相互独立的,而线程存在于进程内,是进程的一个子集进程拥有共享的资源,如内存空间等,供其内部的线程共享

进程间通信较为复杂

  • 同一台计算机的进程通信称为IPC (Inter-process communication)
  • 不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP 

线程通信相对简单,因为它们共享进程内的内存,一个例子是多个线程可以访问同一个共享变量

线程更轻量,线程上下文切换成本一般上要比进程上下文切换低

二、并发和并行

并发

单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows 下时间片最小约为 15 毫秒分给不同的线程使用,只是由于 pu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行,
一般会将这种 线程轮流使用 cPu 的做法称为并发,concurrent

并行

多核下,每个cpu都可以调度线程,这个时候就是并行

三、单核和多核下多线程

单核cpu即使开启了多线程,还是无法提高效率的,本质还是串行的

单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu,不至于一个线程总占用 cpu,别的线程没法干活

多核cpu可以并行跑多个线程,但能否提高程序运行效率还是要分情况的

有些任务,经过精心设计,将任务拆分,并行执行,当然可以提高程序的运行效率。但不是所有计算任务都能拆分(参考后文的[阿姆达尔定律]),也不是所有任务都需要拆分,任务的目的如果不同,谈拆分和效率没啥意义

I0操作不占用 cpu! 只是我们一般拷贝文件使用的是[阻塞10],这时相当于线程虽然不用cpu,但需要一直等待IO结束,没能充分利用线程。所以才有[非阻塞IO]和[异步O]优化

四、创建和运行线程

法一:直接使用Thread

法二:继承runnable配合Thread

Thread代表线程

runnable代表要执行的任务(线程执行的代码)

jdk8以后还可以用lamda表达式来简化匿名内部类

法一法二小结

法三:FutureTask配合Thread

FutureTask能够接收Callable类型的参数,用来处理返回结果的情况

FutureTask也继承了runnable,所以可以跟runnable一样做任务对象,被thread来调用。还继承了future接口,可以返回参数。先了解就好,后面还会加深

五、查看进程

windows

任务管理器可以查看进程和线程数,也可以用来杀死进程
tasklist 查看进程
taskki11杀死进程

linux

ps -fe 查看所有进程
ps -fT -p<PID>查看某个进程(PID)的所有线程
kill 杀死进程
top 按大写H切换是否显示线程
top -H-p<PID>查看某个进程(PID)的所有线程

Java

jps命令查看所有Java进程

jstack<PID>查看某个Java进程(PID)的所有线程状态

jconsole来查看某个Java 进程中线程的运行情况 (是个图形界面)

六、线程的运行原理

栈与栈帧

 比如mian方法运行创建栈帧,main调用a方法创建栈帧2进栈,a调用b,栈帧b进栈,运行完出栈b,然后a出,main栈帧再出,先进后出

如果是多线程是用不同的栈内存,所有栈帧都是不影响的

主要理解:线程之间的栈内存是相互独立的,每个线程又自己的栈内存

线程的上下文切换

从使用cpu到不使用cpu就是一次上下文切换

垃圾回收也会,垃圾回收会暂停当前运行的所有线程,让垃圾回收线程去回收垃圾

频繁的切换上下文会影响性能,所有线程数不是越多越好,超过cpu核心数,在执行的时候就会切换上下文,在切换的时候,要把当前线程的栈帧顺序什么的,全部都记录起来。

怎么选择合适线程数后面会学,关注我的更新!

七、线程常见方法

1、start和run

start是用来启动线程,run是线程启动之后要执行的方法

在start之前线程是new状态,在start之后是runnable状态

2、Sleep

sleep后,线程状态从runnable编程timed waiting(阻塞)

其他线程可以用interrupt方法打断正在睡眠的线程,这时sleep方法会抛出interruptException

睡眠结束以后打断线程不一定立刻执行

TimeUnit来调用sleep比thread来调用好,因为有时间单位 可读性

while(true)防止空转浪费cpu,所有可以配合sleep稍微休眠一下

3、yield

调用yield会让其他线程从running进入runnable就绪状态,然后调度其他线程

具体实现还是看任务调度器不一定礼让成功

4、join

如果调用方需要等待其他线程的结果返回,就需要同步,可以用join方法。

比如a线程要b线程执行结束,那a就join b线程,b线程结束后立马执行a

 而且join可以带参数,有时效,如果等待超过这个时间就不会等待了。

5、interrupt

打断sleep、wait、join的线程(堵塞线程)

打断阻塞状态的线程,打断后打断标记会为false

打断正常运行的线程

打断完之后会到堵塞状态,然后把打断标记为真

八、主线程和守护线程

默认下java进程需要等待所有线程都运行结束,才结束。

守护线程,只要其他非守护线程运行结束,即使守护线程没运行完,也结束

常见:垃圾回收器就是守护线程

九、线程的状态(重点)

1、操作系统层面

初始状态:语言层面创建了线程对象,还没和操作系统关联

可运行状态:线程已经被创建(与操作系统线程关联),可以由cpu调度执行

运行状态:获取了CPU时间片运行中的状态(当cpu时间片用完又会回到可运行状态,造成线程上下文切换)

堵塞状态:调用堵塞api如bio读写文件,这个时候线程时间不会用到cpu,会导致上下文切换进入堵塞状态,等bio执行完毕,会由操作系统唤醒堵塞线程,转换成可运行状态

终止状态:线程执行完毕,生命周期结束

2、Java的层面

thread内部枚举6种状态

new:线程刚创建,但是没调用start()方法

runnable:调用start()之后,Java api层面的runnable状态覆盖了操作系统层面的可运行状态和运行状态和堵塞状态

timed_waiting:有时限的等待,sleep之后就是这个状态

waiting:join之后等待,就是这个状态

blocked:拿不到锁,陷入这个状态

terminated:线程执行完毕,生命周期结束

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

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

相关文章

OpenGL中的坐标系

1、2D笛卡尔坐标系2D笛卡尔坐标系跟我们高中的时候学习的坐标系一样&#xff0c;是由x、y决定的。2、3D笛卡尔坐标系3D笛卡尔坐标系坐标由x、y、z决定&#xff0c;满足右手定则。3、视口glViewport(GLint x,GLint y,GLsizei width,GLsizei height)窗口和视口大小可以相同&#…

手敲Mybatis-反射工具天花板

历时漫长的岁月&#xff0c;终于鼓起勇气继续研究Mybatis的反射工具类们&#xff0c;简直就是把反射玩出花&#xff0c;但是理解起来还是很有难度的&#xff0c;涉及的内容代码也颇多&#xff0c;所以花费时间也比较浩大&#xff0c;不过当了解套路每个类的功能也好&#xff0c…

@mixin与@include介绍

目录mixin与include介绍定义一个mixin使用mixin传递变量如何引入mixinmixin与include介绍 在Sass里面&#xff0c;我们经常会见到mixin与include。 其中 mixin允许定义一个可以在整个样式表中重复使用的样式 include就是将我们定义的mixin引入到文档中 定义一个mixin mixin…

【春招面经】视源股份前端一面

前言 本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09; 文章目录前言本次主要记录一下视源股份CVTE前端一面 &#xff08;3.3下午4点15&#xff09;问题总结介绍一下项目的来源以及做这个项目的初衷一直监听滚动&#xff0c;有没有对性能产生影响&a…

大数据技术之——zeppelin数据清洗

一、zeppelin的安装zeppelin解压后进入到conf配置文件界面。修改zeppelin-site.xml[roothadoop02 conf]# cp zeppelin-site.xml.template zeppelin-site.xml[roothadoop02 conf]# vim zeppelin-site.xml将IP地址和端口号设置成自己的修改 zeppelin-env.shexport JAVA HOME/opt/…

Linux小黑板(10):信号

我们写在linux系统环境下写一个程序&#xff0c;唔&#xff0c;"它的功能是每隔1s向屏幕打印hello world。"这时&#xff0c;我们在键盘上按出"Ctrl C"后,进程会发生什么&#xff1f;&#xff1f;我们清晰地看到&#xff0c;进程已经在我们按出"Ctrl…

UML2——行为图

目录 一、前言 二、活动图 三、交互图 3.1 一般序列图 3.2 时间约束序列图 3.3 协作图 四、用例图 五、状态图 一、前言 UML 是由视图&#xff08;View&#xff09;、图&#xff08;Diagrams&#xff09;、模型元素&#xff08;Model elements&#xff09;和通用机制等几…

(图像分割)基于图论的归一化分割

解释&#xff1a;将图像映射成图&#xff0c;以图为研究对象&#xff0c;利用图的理论知识获得图像的分割。 下面介绍&#xff1a;图的基本理论&#xff0c;基于图论的归一化分割算法 一、图的基本理论 图G&#xff1d;&#xff08;V&#xff0c;E&#xff0c;&#xff09;&…

《管理世界》数据复现:国有资本参股如何影响民营企业?——基于债务融资视角的研究

摘要&#xff1a; 本文以债务融资为切入点&#xff0c;从“未阐明的规则”和“阐明的规则”两个层面探讨了国有资本参股的“反向混改”是否以及如何影响民营企业。研究发现&#xff1a;国有资本参股可以显著降低民营企业的债务融资成本&#xff0c;扩大债务融资规模。…

性能测试——LoadRunner: Controller的使用

Controller Controller是用来创建测试环境&#xff0c;执行在VUG中编写的测试脚本 可以直接点击Controller的快捷方式打开,也可以在VUG中打开 这里将虚拟用户数设置为3,比较适合自己的电脑性能 整个controller分为下面几个模块 这里先设置左下角的目标计划 设置初始化:双击…

PHP 8.1.14升级低版本openssl扩展的操作方法

问题背景&#xff1a; PHP8.1.4内嵌openssl源码编译出来的openssl库版本号是1.0.2.x系列&#xff0c;低版本的openssl扩展存在安全漏洞&#xff0c;需要将该扩展升级openssl 社区最新版本3.0.8 操作步骤&#xff1a; 安装最新版本的openssl wget https://github.com/openssl…

Java面试总结(四)

synchroize的实例、静态、代码块的锁对象 修饰实例方法 修饰静态方法 修饰代码块 1、修饰实例方法 &#xff08;锁当前对象实例&#xff09; 给当前对象实例加锁&#xff0c;进入同步代码前要获得 当前对象实例的锁 。 synchronized void method() {//业务代码 }2、修饰静…

在vue中如果computed属性是一个异步操作怎么办?

在计算属性中使用异步方法时&#xff0c;可以使用async/await来处理异步操作。由于计算属性是基于它们的依赖缓存的&#xff0c;所以我们需要使用一个返回Promise的异步方法来确保计算属性能够正常运行。 下面是一个简单的示例&#xff0c;演示如何在计算属性中使用异步方法&am…

P6入门:P6 Professional常用快捷键/热键

目录 一 引言 Primavera P6 专业版 Primavera P6 EPPM&#xff08;网络客户端&#xff09; Primavera P6 Alt 键 Primavera P6 功能键 一 引言 在 Oracle Primavera P6 中&#xff0c;有热键命令可以节省宝贵的时间。尤其是作为一个与 Primavera P6 长打交道人熟练掌握这…

苹果手机备份的文件在电脑什么地方 苹果备份文件怎么查看

在这个网络信息时代&#xff0c;为手机进行定期备份已经成为了家常便饭。在使用备份软件对苹果手机进行备份后&#xff0c;苹果手机备份的文件在什么地方&#xff0c;苹果备份文件怎么查看呢&#xff1f;本文就带大家来了解一下。 一、苹果手机备份的文件在电脑什么地方 大家…

数据库三大范式、BC范式、第四范式

目录第一范式&#xff08;1NF&#xff09;&#xff1a;原子性&#xff08;存储的数据应该具有“不可再分性”&#xff09;第二范式&#xff08;2NF&#xff09;&#xff1a;唯一性 (消除非主键部分依赖联合主键中的部分字段)&#xff08;一定要在第一范式已经满足的情况下&…

Python之flask基础

文章目录入门小案例及认识路由小总结配置文件路由系统路由支持正则cbv &#xff08;用的比较少&#xff09;模板渲染变量及循环请求响应pipreqs&#xff08;找当前项目依赖的包&#xff09;闪现&#xff08;flash&#xff09;请求扩展&#xff08;类似中间件&#xff09;猴子补…

【Redis】Redis集群之哨兵机制

【Redis】Redis集群之哨兵机制 文章目录【Redis】Redis集群之哨兵机制1. 哨兵的作用和原理1.1 哨兵的作用1.2 redis服务状态监控1.3 选举新master1.4 故障转移1.5 总结2. 搭建哨兵集群2.1 准备实例和配置2.2 启动2.3 测试3. RedisTemplate的哨兵模式1. 哨兵的作用和原理 1.1 哨…

1634_linux中把pdf拆分成独立的图片文件

全部学习汇总&#xff1a; GreyZhang/toolbox: 常用的工具使用查询&#xff0c;非教程&#xff0c;仅作为自我参考&#xff01; (github.com) 最近工作学习之中使用pdf的频次非常高&#xff0c;这种格式的通用性的确是不错。在目前的很多平台上都有很好用的软件。不过&#xff…

ios设备管理软件 2.16.9官网Mac/Windows下载电脑版功能介绍

imazing 2.16.9官网Mac/Windows下载电脑版是款针对苹果设备所打造的管理工具。iMazing为用户提供多种设备管理功能&#xff0c;每一位用户都能以自己的形式管理苹果设备。iMazing与苹果设备连接后&#xff0c;用户就可以轻松传输文件&#xff0c;浏览保存信息等。 应用介绍 i…