详解程序进程与线程
Posted Ferron Zhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了详解程序进程与线程相关的知识,希望对你有一定的参考价值。
1、概念
程序:程序只是一串代码,是一串指令的有序集合,它只是一个静态的实体,本身并没有任何运行的含义。
进程:进程是一个程序(可以理解成一串代码)的一次运行,它相当于是一串代码执行的过程。包含了代码的加载、执行一直到执行完成。在Java中这个过程便是相当于一个源代码(.java)经过编译器javac编译成字节码(.class)文件之后,再由JVM中的类加载器加载字节码文件,创建的类、实例和成员变量存储在堆内存,而方法与局部变量等就存储在栈内存,一直该字节码解释完成为止。进程是系统进行资源分配和调度的一个独立单位。
线程:线程的话则相当于是进程的一个实体,是CPU调度和分派的基础单位,它是比进程更小的一个能够独立运行的基本单位。一个进程有一个或多个线程,线程属于进程。
2、程序与进程的区别
状态 | 是否具有资源 | 是否有唯一标识符 | 是否具有并发性 | |
---|---|---|---|---|
进程 | 动态 | 有 | 有 | 有 |
程序 | 静态 | 无 | 有 | 无 |
3、进程的基本状态
- 就绪状态:当一个进程获得除CPU资源以外的所有资源,只要一旦获得CPU资源就可运行时,此时就为就绪状态。
- 执行状态:进程已获得CPU资源,正在执行。
- 阻塞状态:正在执行的进程因为发生某些事件而暂时无法继续执行,此时相当于整个进程暂停了。进一步了解阻塞Java中的BIO、NIO和AIO
4、线程生命周期
-
创建:Java中线程的创建有两种方式:继承
Thread
父类或实现Runable
接口 -
执行:Java中线程创建就有了该线程的内存空间,但是JVM并没有让这个线程开始执行,而是必须调用该线程的
start()
方法后,该线程才会开始执行。 -
中断:
- JVM将CPU的使用资源分配给了其他线程
- 该线程执行时调用了
sleep()
或wait()
方法 - 该线程在使用CPU资源过程中,发生了某些事件导致了阻塞
-
死亡:
- 线程执行完毕
- 线程在执行完毕之前被提前终止。
5、线程状态
线程的状态与程序的生命周期息息相关,以下是线程的六种状态
- 初始化:该线程已经被初始化,其在JVM中已经占用内存空间,但是不属于JVM管理的线程中,也就是该线程没有执行其
start()
方法 - 运行:这种状态就是线程被初始化之后并且调用了
start()
方法,该种状态有两种情况:准备就绪和运行中,区别就是是否获得了CPU资源。 - 阻塞:该线程调用
sleep()
、wait()
方法、等待I/O或无法持有锁进入同步代码时,线程进入阻塞状态。 - 等待:该线程进入等待执行的状态,需要要某些特定事件显式地唤醒,否则会无限期地等待
- 超时等待:该线程进入等待执行的状态,其也可以被某些事件显式地唤醒,但是与等待不同的是,这种状态等待一个特定的时间候会被唤醒。
- 终止:该线程已经执行完毕。
件显式地唤醒,但是与等待不同的是,这种状态等待一个特定的时间候会被唤醒。
- 终止:该线程已经执行完毕。
以上是关于详解程序进程与线程的主要内容,如果未能解决你的问题,请参考以下文章