当前位置: 首页 > >

java 进程,线程及状态转换

发布时间:



文章目录
程序进程进程(道路)与线程(车道)程序和进程之间的主要区别进程的基本状态1.就绪(Ready)状态2.执行状态3.阻塞状态
线程状态转换


程序

一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本。


进程

是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命周期。它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消。反映了一个程序在一定的数据 集上运行的全部动态过程。通过进程控制块(PCB)唯一的标识某个进程。同时进程占据着相应的资源(例如包 括cpu的使用 ,轮转时间以及一些其它设备的权限)。是系统进行资源分配和调度的一个独立单位。


进程(道路)与线程(车道)

假如我们把城市里的整条道路看成是一个“进程”的话,那么由白色虚线分隔开来的各个车道就是进程中的各个“线程”。


    线程(车道)共享了进程(道路)的公共资源(土地资源)。
    这些线程(车道)必须依赖于进程(道路),也就是说,线程不能脱离于进程而存在(就像离开了道路,车道也就没有意义了)。这些线程(车道)之间可以并发执行(各个车道你走你的,我走我的),也可以互相同步(某些车道在交通灯亮时禁止继续前行或转弯,必须等待其它车道的车辆通行完毕)。这些线程(车道)之间依靠代码逻辑(交通灯)来控制运行,一旦代码逻辑控制有误(死锁,多个线程同时竞争唯一资源),那么线程将陷入混乱,无序之中。这些线程(车道)之间谁先运行是未知的,只有在线程刚好被分配到CPU时间片(交通灯变化)的那一刻才能知道。

程序和进程之间的主要区别
区别状态是否具有资源是否有唯一标识是否具有并发性
进程动态
程序静态

进程的基本状态
1.就绪(Ready)状态

当进程已分配到除CPU以外的所有必要资源后,只要在获得CPU,便可立即执行,进程这时的状态就称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将他们排成一个队列,称为就绪队列。


2.执行状态

进程已获得CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;再多处理机系统中,则有多个进程处于执行状态。


3.阻塞状态

正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即程序的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。


三种进程之间的转换图:


线程: 可以理解为进程的多条执行线索,每条线索又对应着各自独立的生命周期。线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
这里在详细讲解一下Java中的进程和线程的概念。


线程状态转换

线程的状态使用一个枚举类型来描述的。这个枚举一共有6个值: NEW(新建)、RUNNABLE(运行)、BLOCKED(锁池)、TIMED_WAITING(定时等待)、WAITING(等待)、TERMINATED(终止、结束)。
Thread->State



//观察线程状态
public class TestThreadState {

public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(()->{
for (int i = 0; i <5 ; i++) {
try {
Thread.sleep(1000);
System.out.println("current state:"+ Thread.currentThread().getName()+":"+Thread.currentThread().getState());

} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("over");
});

//观察状态
Thread.State state = thread.getState();
System.out.println(thread.getName()+":1"+ state); //new


//观察启动后
thread.start(); //启动线程
state = thread.getState();
System.out.println(thread.getName()+":2"+state); //RUNNABLE

while (state != Thread.State.TERMINATED){

Thread.sleep(500);
state = thread.getState(); //更新线程状态
System.out.println(thread.getName()+":3"+ state); //输出状态 结束后TERMINATED
}
}
}

参考:
https://www.cnblogs.com/GooPolaris/p/8079490.html



友情链接: