深入探究Java线程与进程有哪些区别

 更新时间:2022年04月26日 10:21:59   作者:淡沫初夏Zz  
这篇文章主要介绍了Java并发编程之线程创建,进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是一个实体,一个进程中至少有一个线程,下文更多相关内容需要的小伙伴可以参考一下

一、进程线和程的概念

线程: 一个线程是一个独立的执行流,每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 “同时” 执行着多份代码

public class ThreadDemo {
    public static void main(String[] args) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                //具体业务
                Thread thread1 = Thread.currentThread();
                System.out.println("名称:" + thread1.getName());
            }
        });
        //开启线程
        thread.start();
    }
}

从以上代码可以看出,每个线程都是一个独立的执行流

进程:一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程

二、为什么要有线程

(1)首先并发编程成为需求

当单核CPU遇到问题,还是会采用多核CPU,那么并发编程能更充分利用多核 CPU资源

(2)虽然进程也可以并编程,但是线程更轻量

①创建线程比创建进程更快.

②销毁线程比销毁进程更快.

③调度线程比调度进程更快.

(3)那么是不是线程创建越多越好

不是的,当线程创建过多,会造成恶意争抢和线程过度调度,返回时就会降低执行效率

三、进程和线程的关系

一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 (线程私有)和 本地方法栈(线程私有)

什么是虚拟机栈,本地方法栈

(1)虚拟机栈:每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。

(2)本地方法栈:和虚拟机栈所发挥的作用非常相似,区别是: 虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一

四、线程和进程的区别(重点)

  • 从属关系上:线程属于进程,而对于进程,则不属于线程
  • 共享方式:线程之间资源和地址空间是可以共享的,而进程之间的地址空间和资源是相互独立的
  • 描述的侧重点:线程是操作系统调度的最小单位,进程是系统分配资源的最小单位
  • 上下切换的速度:线程是比较快的,而相对于进程就比较慢
  • 操作对象:进程是操作系统操控,而线程是程序员可以用编码操纵

五、用户线程和守护线程区别

  • Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程),守护线程等,在main线程是默认的非守护线程,也就是用户线程
  • 在用户线程创建线程也是用户线程
  • 在守护线程下创建的子线程也是守护线程

关系:当没有用户线程,那么守护线程也就没存在必要了

区别:JVM不等待守护线程执行完退出,JVM会等待用户线程执行完退出

到此这篇关于深入探究Java线程与进程有哪些区别的文章就介绍到这了,更多相关Java线程与进程内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中异常传播的实现

    Java中异常传播的实现

    在Java中,异常传播是一个重要的概念,本文主要介绍了Java中异常传播的实现,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • 解读java try catch 异常后还会继续执行吗

    解读java try catch 异常后还会继续执行吗

    这篇文章主要介绍了解读java try catch 异常后还会不会继续执行问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • Java多线程与线程池技术分享

    Java多线程与线程池技术分享

    这篇文章主要介绍了Java多线程与线程池技术分享,线程池本质是池化技术的应用,和连接池类似,创建连接与关闭连接属于耗时操作,下文相关介绍需要的小伙伴可以参考一下
    2022-03-03
  • Java并发编程之关键字volatile知识总结

    Java并发编程之关键字volatile知识总结

    今天带大家学习java的相关知识,文章围绕着Java关键字volatile展开,文中有非常详细的知识总结,需要的朋友可以参考下
    2021-06-06
  • java.net.ConnectException: Connection refused问题解决办法

    java.net.ConnectException: Connection refused问题解决办法

    这篇文章主要介绍了java.net.ConnectException: Connection refused问题解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • 简述Java中进程与线程的关系_动力节点Java学院整理

    简述Java中进程与线程的关系_动力节点Java学院整理

    在 Java 语言中,对进程和线程的封装,分别提供了 Process 和 Thread 相关的一些类。本文首先简单的介绍如何使用这些类来创建进程和线程
    2017-05-05
  • 比较排序之快速排序(实例代码)

    比较排序之快速排序(实例代码)

    下面小编就为大家带来一篇比较排序之快速排序(实例代码)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • 如何通过RabbitMq实现动态定时任务详解

    如何通过RabbitMq实现动态定时任务详解

    工作中经常会有定时任务的需求,常见的做法可以使用Timer、Quartz、Hangfire等组件,这次想尝试下新的思路,使用RabbitMQ死信队列的机制来实现定时任务,下面这篇文章主要给大家介绍了关于如何通过RabbitMq实现动态定时任务的相关资料,需要的朋友可以参考下
    2022-01-01
  • Java如何分析算法的时间和空间复杂度

    Java如何分析算法的时间和空间复杂度

    这篇文章主要介绍了Java如何分析算法的时间和空间复杂度,在计算机科学中,计算复杂性解释了算法的性能。文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-06-06
  • Spring Boot Admin 动态修改日志级别的方法步骤

    Spring Boot Admin 动态修改日志级别的方法步骤

    这篇文章主要介绍了Spring Boot Admin 动态修改日志级别的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08

最新评论