首页 > 系统相关 >一文讲明白Java中线程与进程、并发与并行、同步与异步

一文讲明白Java中线程与进程、并发与并行、同步与异步

时间:2024-03-05 09:02:46浏览次数:27  
标签:异步 Java 程与 并发 线程 进程 main CPU

写在开头

ok,everybody,在过去的两周内,我们大体上讲完了Java的集合,在最后我们探讨了关于HashMap线程不安全的原因,又提出了ConcurrentHashMap这个线程安全的集合解决方案,那么在接下来的2-3周内,我们就一起来学习一下Java中的并发多线程。
在开始学习之前,我们必须要搞清楚几个概念:线程与进程、并发与并行、同步与异步。

线程与进程

Java的并发指的是多线程,而与多线程对应的有个进程的概念,啥是进程呢?我们通过CTRL+SHIFT+ESC组合快捷键打开电脑的任务管理器,我们就看到了如下的这幅图。

这里面执行的每一条就是一个进程,它是程序执行时的一个实例,操作系统会为每个进程分配独立的内存地址空间,因此,进程也是系统进行资源分配和调度的基本单位。

而线程是比进程更小的执行单位,是进程的子任务,因此它本身不会独立存在,系统不会为线程分配内存,线程组之间只能共享所属进程的资源,而线程仅仅是CPU 调度和分派的基本单位,当前线程 CPU 时间片用完后,会让出 CPU 等下次轮到自己时候在执行。

进程与线程的关系

  1. 一个程序至少一个进程,一个进程至少一个线程,进程中的多个线程是共享进程的资源(堆,字符串常量池(JDK1.8)/方法区(JDK1.7));

  2. 一个进程中有多个线程,多个线程共享进程的堆和方法区资源,但是每个线程有自己的程序计数器,栈区域;

  3. Java 中当我们启动 main 函数时候就启动了一个 JVM 的进程,而 main 函数所在线程就是这个进程中的一个线程,也叫做主线程。 我们通过JMX(Java Management Extensions)管理器去监控一下JVM,看下面这段代码示例:
    【代码示例1】

public class Test {
    public static void main(String[] args) {
        // 获取 Java 线程管理 MXBean
        ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean();
        // 不需要获取同步的 monitor 和 synchronizer 信息,仅获取线程和线程堆栈信息
        ThreadInfo[] threadInfos = threadMXBean.dumpAllThreads(false, false);
        // 遍历线程信息,仅打印线程 ID 和线程名称信息
        for (ThreadInfo threadInfo : threadInfos) {
            System.out.println("[" + threadInfo.getThreadId() + "] " + threadInfo.getThreadName());
        }
    }
}

输出:

[6] Monitor Ctrl-Break //监控Ctrl-Break中断信号的线程
[5] Attach Listener //添加事件
[4] Signal Dispatcher // 分发处理给 JVM 信号的线程
[3] Finalizer //调用对象 finalize 方法的线程
[2] Reference Handler //清除 reference 线程
[1] main //main 线程,程序入口

由此可见一个JVM进程在运行时,包含了很多个子线程。

并发与并行

并行: 指两个或两个以上事件或活动在同一时刻发生。如多个任务在多个 CPU 或 CPU 的多个核上同时执行,不存在 CPU 资源的竞争、等待行为。
并发: 并发指在某时刻只有一个事件在发生,某个时间段内由于 CPU 交替执行,可以发生多个事件,存在对 CPU 资源进行抢占。

同步与异步

同步: 发出一个调用之后,在没有得到结果之前, 该调用就不可以返回,一直等待。
异步: 调用在发出之后,不用等待返回结果,该调用直接返回。

结尾彩蛋

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏呀。原创不易,转载请联系Build哥!

如果您想与Build哥的关系更近一步,还可以关注俺滴公众号“JavaBuild888”,在这里除了看到《Java成长计划》系列博文,还有提升工作效率的小笔记、读书心得、大厂面经、人生感悟等等,欢迎您的加入!

标签:异步,Java,程与,并发,线程,进程,main,CPU
From: https://www.cnblogs.com/JavaBuild/p/18053171

相关文章

  • 学java09类型转换
    1类型由低到高byte,short,char-->int-->long-->float-->double2强制类型转换(由高到低)“(类型)变量名”如(byte)i(byte大小在127以内)3自动转换(由低到高)4注意点1.不能对布尔值进行转换2.不能把对象类型转换成不相干的类型3.由高到低转换需要强制转换4.转换时可能存在内存溢出,或......
  • 学java08数据类型扩展
    1.整数拓展二进制前面加“0b”;八进制加0;十进制不写;十六进制0x2.浮点数float特征:有限,离散,舍入误差,接近但不等于因此最好完全不要使用浮点数进行比较问:银行业务一般怎么表示钱?答:一般可以用BigDecimal表示和比较3.Boolean布尔值扩展a."if(flag==true){}"b."if(flag){......
  • 2024-selenium-问题一:java.io.IOException: Invalid Status code=403 text=Forbidden
    问题截图:  问题分析: 参考网址:https://blog.csdn.net/weixin_46739493/article/details/134163739问题解决:1、chrome版本为:版本114.0.5735.199(正式版本);driver的版本为:114.0.5735.90; java-seleium版本为:4.0.0-rc-21<dependency>2<groupId>org.......
  • 学java11运算符
    运算符java支持以下运算符优先级()多用括号1.算术运算符:+,-,*,/,%(取余运算,模运算),++,--//++a先自增再给c赋值a=a+1//a++先给b赋值再自增a=a+1a--和--a原理同上2.赋值运算符:=3.关系运算符:>,<,>=,<=,==,(不等于)!=,instanceof4.逻辑运算符:&&(与),||(或),“!()”(非)&&逻......
  • 学java10变量
    1.变量:可以变化的量Java是一种强类型语言,每个变量都必须声明其类型。Java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。//数据类型变量名=值;可以使用逗号隔开来声明多个同类型变量(但不建意)inta=1,b=2,c=3;Stringname="lml";charx="X";doubl......
  • JavaWeb
    JavaWebJavaWeb组件首先献上Tomcat架构神图:ServletServlet容器:运行在Web服务器上的程序,作为来自HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层,它负责处理用户的请求,并根据请求生成相应的返回信息提供给用户。​ 大体原理图如下:Servlet请求的处理......
  • Java基础复习题1-100
    JAVA基础1~100下列哪个关键字可以使成员变量或方法不被子类继承? CA.static B.final C.private D.protectedprivate关键字被用来修饰成员变量或方法,表示它们只能在当前类内部访问,无法被其他类或子类访问。当一个成员被声明为private后,它就成为了该类的私有成员,只能在该类......
  • Java基础复习题201-290
    JAVA基础201~290Java中的接口可以包含实现代码。 BA.正确 B.错误在Java中,数组元素的下标从0开始。 AA.正确 B.错误在Java中,System.out.println()方法可以用于在控制台输出文本。 AA.正确 B.错误在Java中,静态变量和实例变量的值都存在对象内存空间中。 BA.......
  • Java基础复习题101-200
    JAVA基础101~200在Java中,while和do-while循环的区别是,do-while循环至少会执行一次循环体。 AA.正确 B.错误在Java中,do-while循环和while循环的区别在于条件判断的位置。while循环先判断条件是否为真,然后再执行循环体;而do-while循环先执行一次循环体,然后再判断条件是否为真......
  • Java知识点-笔记
    知识点集合实例变量实例变量是指在类中声明的变量,其值是针对类的每个实例而独立存储的。每个类的实例都有自己的一组实例变量,它们的值可以在对象创建时初始化,并在整个对象的生命周期中保持不变或者随着对象的状态而改变。实例变量也被称为对象变量,因为它们是在类的对象实例化时......