兰州市建设局网站,中国十大mro电商企业,广州推神网络科技有限公司,考研培训机构排名什么是线程和进程? 文章目录 什么是线程和进程?何为进程?何为线程? Java 线程和操作系统的线程有啥区别#xff1f;请简要描述线程与进程的关系,区别及优缺点#xff1f;图解进程和线程的关系程序计数器为什么是私有的?虚拟机栈和本地方法栈为什么是私有的?一句话简单了…什么是线程和进程? 文章目录 什么是线程和进程?何为进程?何为线程? Java 线程和操作系统的线程有啥区别请简要描述线程与进程的关系,区别及优缺点图解进程和线程的关系程序计数器为什么是私有的?虚拟机栈和本地方法栈为什么是私有的?一句话简单了解堆和方法区 何为进程?
进程是程序的一次执行过程是系统运行程序的基本单位因此进程是动态的。系统运行一个程序即是一个进程从创建运行到消亡的过程。
在 Java 中当我们启动 main 函数时其实就是启动了一个 JVM 的进程而 main 函数所在的线程就是这个进程中的一个线程也称主线程。
如下图所示在 Windows 中通过查看任务管理器的方式我们就可以清楚看到 Windows 当前运行的进程.exe 文件的运行。 何为线程?
线程与进程相似但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源但每个线程有自己的程序计数器、虚拟机栈和本地方法栈所以系统在产生一个线程或是在各个线程之间作切换工作时负担要比进程小得多也正因为如此线程也被称为轻量级进程。
Java 程序天生就是多线程程序我们可以通过 JMX 来看看一个普通的 Java 程序有哪些线程代码如下。
public class MultiThread {public static void main(String[] args) {// 获取 Java 线程管理 MXBeanThreadMXBean threadMXBean ManagementFactory.getThreadMXBean();// 不需要获取同步的 monitor 和 synchronizer 信息仅获取线程和线程堆栈信息ThreadInfo[] threadInfos threadMXBean.dumpAllThreads(false, false);// 遍历线程信息仅打印线程 ID 和线程名称信息for (ThreadInfo threadInfo : threadInfos) {System.out.println([ threadInfo.getThreadId() ] threadInfo.getThreadName());}}
}上述程序输出如下输出内容可能不同不用太纠结下面每个线程的作用只用知道 main 线程执行 main 方法即可
[5] Attach Listener //添加事件
[4] Signal Dispatcher // 分发处理给 JVM 信号的线程
[3] Finalizer //调用对象 finalize 方法的线程
[2] Reference Handler //清除 reference 线程
[1] main //main 线程,程序入口从上面的输出内容可以看出一个 Java 程序的运行是 main 线程和多个其他线程同时运行。
Java 线程和操作系统的线程有啥区别
JDK 1.2 之前Java 线程是基于绿色线程Green Threads实现的这是一种用户级线程用户线程也就是说 JVM 自己模拟了多线程的运行而不依赖于操作系统。由于绿色线程和原生线程比起来在使用时有一些限制比如绿色线程不能直接使用操作系统提供的功能如异步 I/O、只能在一个内核线程上运行无法利用多核在 JDK 1.2 及以后Java 线程改为基于原生线程Native Threads实现也就是说 JVM 直接使用操作系统原生的内核级线程内核线程来实现 Java 线程由操作系统内核进行线程的调度和管理。
我们上面提到了用户线程和内核线程考虑到很多读者不太了解二者的区别这里简单介绍一下
用户线程由用户空间程序管理和调度的线程运行在用户空间专门给应用程序使用。内核线程由操作系统内核管理和调度的线程运行在内核空间只有内核程序可以访问。
顺便简单总结一下用户线程和内核线程的区别和特点用户线程创建和切换成本低但不可以利用多核。内核态线程创建和切换成本高可以利用多核。
一句话概括 Java 线程和操作系统线程的关系现在的 Java 线程的本质其实就是操作系统的线程。
线程模型是用户线程和内核线程之间的关联方式常见的线程模型有这三种
一对一一个用户线程对应一个内核线程多对一多个用户线程映射到一个内核线程多对多多个用户线程映射到多个内核线程 在 Windows 和 Linux 等主流操作系统中Java 线程采用的是一对一的线程模型也就是一个 Java 线程对应一个系统内核线程。Solaris 系统是一个特例Solaris 系统本身就支持多对多的线程模型HotSpot VM 在 Solaris 上支持多对多和一对一。具体可以参考 R 大的回答: JVM 中的线程模型是用户级的么。
虚拟线程在 JDK 21 顺利转正关于虚拟线程、平台线程也就是我们上面提到的 Java 线程和内核线程三者的关系可以阅读我写的这篇文章Java 20 新特性概览。
请简要描述线程与进程的关系,区别及优缺点
从 JVM 角度说进程和线程之间的关系。
图解进程和线程的关系
下图是 Java 内存区域通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。 从上图可以看出一个进程中可以有多个线程多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈。
总结 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的而各线程则不一定因为同一进程中的线程极有可能会相互影响。线程执行开销小但不利于资源的管理和保护而进程正相反。
下面是该知识点的扩展内容
下面来思考这样一个问题为什么程序计数器、虚拟机栈和本地方法栈是线程私有的呢为什么堆和方法区是线程共享的呢
程序计数器为什么是私有的?
程序计数器主要有下面两个作用
字节码解释器通过改变程序计数器来依次读取指令从而实现代码的流程控制如顺序执行、选择、循环、异常处理。在多线程的情况下程序计数器用于记录当前线程执行的位置从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。
需要注意的是如果执行的是 native 方法那么程序计数器记录的是 undefined 地址只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。
所以程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。
虚拟机栈和本地方法栈为什么是私有的?
虚拟机栈 每个 Java 方法在执行之前会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。本地方法栈 和虚拟机栈所发挥的作用非常相似区别是虚拟机栈为虚拟机执行 Java 方法 也就是字节码服务而本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
所以为了保证线程中的局部变量不被别的线程访问到虚拟机栈和本地方法栈是线程私有的。
一句话简单了解堆和方法区
堆和方法区是所有线程共享的资源其中堆是进程中最大的一块内存主要用于存放新创建的对象 (几乎所有对象都在这里分配内存)方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。 大家好我是xwhking一名技术爱好者目前正在全力学习 Java前端也会一点如果你有任何疑问请你评论或者可以加我QQ2837468248说明来意希望能够与你共同进步