本文旨在作学习记录,内容源自JavaGuide,作者在此基础上进行补充说明、整理论述,使其能以一种更为逻辑地清晰地方式表达出“请你说一下线程和进程的区别(java)”的理解,更多适应于java面试回答,亦可作对java中关于线程和进程的简要了解。
一、进程的定义
定义:并发执行的程序在执行过程中(操作系统)分配和管理资源的基本单位,是动态概念。系统运行一个程序即是一个进程从创建,运行到消亡的过程。
二、线程的定义
定义:线程是CPU调度的基本单位,是比进程更小的执行单位,一个进程在执行过程中可以产生多个线程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
三、java语言中关于两者的区别
线程和进程区别:
①.线程是进程划分成的更小的执行单位。
②.与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
③.线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。
④.线程执行开销小,但不利于资源的管理和保护;而进程正相反。
补充说明上述第二点区别。首先,如果你对 Java 内存区域 (运行时数据区) 不太了解的话,不妨拜读下该篇文章《可能是把Java内存区域讲的最清楚的一篇文章》。接下来,分别论述为何某些数据区是线程私的有或线程共享的。下图转载自JavaGuide。
数据区私有:
在程序计数器中,计数器记录着当前线程的执行位置,当线程切换回来的时候(如因为时间片耗尽,线程重新等待,当再次获取CPU资源时候,将移动至上次未执行的位置)知道执行到哪了。即线程切换后能恢复到正确的位置。所以程序计数器私有。
在虚拟机栈(java栈)中,虚拟机栈是由一个个栈帧组成,组成包括局部变量表、操作数栈、动态链接。方法出口信息。而局部变量表保存着各种数据类型数据和对象引用,即java栈为了保证线程中的局部变量不被其他的线程访问。
在本地方法栈中,它与虚拟机栈同理,由栈帧组成,组成包含局部变量表。(本地方法栈为native方法服务,虚拟机栈为java方法服务),即本地方法栈为了保证线程中的局部变量不被其他的线程访问。
数据区共享:
堆存放的是对象实例,方法区存放的是已被虚拟机加载后的类信息、常量、静态变量、即时编译器编译后的代码。即堆和方法区被线程共享。
四、结语
如果对你有帮助,请点赞收藏,谢谢哈。