目录
进程和线程
进程的概念:
进程是操作系统对一个正在运行的程序的一种抽象, 可以这么说 , 进程可以看作是一个程序的一次运行过程, 在操作系统里面, 进程又是操作系统进行资源分配的基本单位.
线程的概念:
线程是什么? 一个线程就是一个 "执行流". 每个线程之间都可以按照顺讯执行自己的代码. 多个线程之间 "同时" 执行 着多份代码. 具体的概念和线程差不多 , 但是可以把线程看作是 轻量级进程
[ 创建线程比创建进程要更快 , 销毁线程比销毁进程要更快 , 调度线程比调度进程要更快 ]
进程和线程的区别
1. 进程是系统进行资源分配和调度的一个独立单位,线程是程序执行的最小单位。 2. 进程有自己的内存地址空间,线程只独享指令流执行的必要资源,如寄存器和栈。 3. 由于同一进程的各线程间共享内存和文件资源,可以不通过内核进行直接通信。 4. 线程的创建、切换及终止效率更高。
从JVM角度说进程和线程之间的关系(*)
图解
一个进程可以有多个线程,多个线程共享进程的堆和方法区(JDK 1.8 之后的元空间)资源。但是每个线程有自己的程序计数器、虚拟机栈和本地方法栈**。
(1) 程序计数器为什么是私有的?
首先明确程序计数器的作用:
字节码解释器通过改变程序计数器来一次读取指令,从而实现代码的流程控制。如:顺序执行、选择、循环、异常处理。
在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程运行到哪了。
需要注意的是:如果执行的是 native 方法,那么程序计数器记录的是 undefined 地址,只有执行的是 Java 代码时程序计数器记录的才是下一条指令的地址。
所以,程序计数器私有主要是为了线程切换后能够恢复到正确的执行位置。
(2) 虚拟机栈和本地方法栈为什么是私有的?
虚拟机栈:每个Java 方法在执行的同时会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至完成的过程,就对应一个帧栈在 Java 虚拟机中入栈和出栈的过程。
本地方法栈:和虚拟机的作用非常相似。区别是:虚拟机为虚拟机执行 Java 方法(也就是字节码)服务,而本地方法栈则为虚拟机使用到的 native 方法服务。在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
所以,为了保证线程中的局部变量不被别的线程访问到,虚拟机栈和本地方法栈是线程私有的。
(3) 堆和方法区
堆和方法区是所有线程共享的资源,其中堆是进程中最大的一块内存,主要用来存放新创建的对象(所有的对象都在这里分配内存);方法区主要用于存放已被加载的类信息、常量、静态变量、即时编译器编译后的代码数据等。
多进程和多线程的区别
多进程:操作系统中同时运行的多个程序
多线程:在同一个进程中同时运行的多个任务
1,多进程的概念
我们现在所使用的计算机的操作系统都是多任务的OS,每个独立执行的任务就是一个进Ctrl+Alt+.
打开任务管理器,如下图,它们每个都是一个进程。
操作系统如何管理这些进程呢?
OS将时间划分为多个时间片,(非常短,纳秒/微秒级),每个时间片内将CPU分配给某一个任务,时间片结束,CPU将自动回收,再分配给另外的任务。从外部看来,所有任务是同时在执行。但是在CPU上,如果是单核CPU,任务是按照串行依次运行;如果是多核CPU,多个进程任务可以并行。
多进程的优缺点
- 多进程的优点
- 可以同时运行多个任务
- 程序因IO堵塞时,可以释放CPU,让CPU为其他程序服务
- 当系统有多个CPU时,可以为多个程序同时服务
- 多进程的缺点
- 太笨重,不好管理,不好切换。
2,多线程的概念
一个程序可以包括多个子任务,可串/并行,每个子任务可以称为一个线程。
多线程的优点
- 线程共享数据:这些线程都属于同一个程序中,只是不同的子模块,因此,这些线程之间可以共享一部分数据。
- 线程通讯更高效
- 线程更轻量级,更容易切换
- 多个线程更容易管理
多线程并不能提高运行速度,但可以提高运行效率,让CPU的使用率更高。但是如果多线程有安全问题或出现频繁的上下文切换时,运算速度可能反而更低。
Java中的多线程
Java程序的进程里有几个线程:主线程,垃圾回收线程(后台线程)等
在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。
Java支持多线程,当Java程序执行main方法的时候,就是在执行一个名字叫做main的线程,可以在main方法执行时,开启多个线程A,B,C,多个线程 main,A,B,C同时执行,相互抢夺CPU,Thread类是java.lang包下的一个常用类,每一个Thread类的对象,就代表一个处于某种状态的线程