一、线程的状态

新建状态、就绪状态、阻塞状态、死亡状态。

1、新建状态

新创建一个线程对象。

2、就绪状态

线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于“可运行的线程池”中,变得可运行,只等待获取CPU的使用权。即在就绪状态的进程除了CPU之外,其他的运行所需资源都已全部获得。

2.1、就绪状态只是说有资格运行,调度程序没有挑选到你,你就永远是可运行状态。

2.2、调用线程的start()方法,此线程进入就绪状态。

2.3、当前线程sleep()方法结束,其他线程join()结束,等待用户输入完毕,某个线程拿到对象锁,这些线程也将进入就绪状态。

2.4、当前线程时间片用完了,调用当前线程的yeild()方法,当前线程进入就绪方法。

2.5、锁池里的线程拿到对象锁后,进入就绪状态。

3、运行状态

就绪状态的线程获取了CPU,执行程序代码。

3.1、run()方法或main()方法结束后,线程就进入终止状态。

3.2、当线程调用了自身的sleep()方法或其他线程的join()方法,进程让出CPU,然后就会进入阻塞状态(该状态即停止当前线程,但并不释放所占有的资源即调用sleep()方法后,线程不会释放它的”锁标志“)。当sleep()结束或join()结束后,该线程进入就绪状态,继续等待OS分配CPU时间片。典型的,sleep()被用在等待某个资源就绪的情形:测试发现条件不满足后,让线程阻塞一段时间后重新测试,直到条件满足为止。

3.3、线程调用了yield方法,意思是放弃当前获得的CPU时间片,回到就绪状态,这是与其他进程处于同等竞争状态,OS有可能会接着让这个进程进入运行状态,调用yield()的效果等价于调度程序认为该线程已执行了足够的时间片从而需要转到另一个线程。yield()只是使当前线程重新回到可执行状态,所以执行yield()的线程有可能在进入到可执行状态后马上又被执行。

3.4、当线程进入就绪状态,发现将要调用的资源被synchronized,获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这是的锁池里也许已经有了其他线程在等待获取所标记,这时它们处于队列状态,即先到先得),一旦线程获得锁标记后,就转入就绪状态,等待OS分配时间片。

3.5、suspend()和resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须被对应的resume()调用,才能使得线程重新进入可执行状态。典型的,suspend()和resume()被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生看了结果后,调用resume()使其恢复。

3.6、wait()和notify()方法:当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒所有线程),线程被唤醒后会进入锁池,den

4、阻塞状态

阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。

阻塞的情况分三种:

4.1、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入”等待池“中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或者notifyAll()方法才能被唤醒。

4.2、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入”锁池“中。

4.3、其他阻塞:运行的线程执行了sleep()或join()方法,或者发出了i/o请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者i/o处理完毕时,线程重新转入就绪状态。

4.4、当线程刚进入可运行状态(注意,还没运行),发现将要调用的资源被synchroniza(同步),获取不到锁标记,将会立即进入锁池状态,等待获取锁标记(这时的锁池里也许已经有了其他线程在等待获取锁标记,这时它们处于队列状态,既先到先得),一旦线程获得锁标记后,就转入就绪状态,等待OS分配CPU时间片;
4.5. suspend() 和 resume()方法:两个方法配套使用,suspend()使得线程进入阻塞状态,并且不会自动恢复,必须其对应的resume()被调用,才能使得线程重新进入可执行状态。典型地,suspend()和 resume() 被用在等待另一个线程产生的结果的情形:测试发现结果还没有产生后,让线程阻塞,另一个线程产生了结果后,调用 resume()使其恢复。 
4.6、wait()和 notify() 方法:当线程调用wait()方法后会进入等待队列(进入这个状态会释放所占有的所有资源,与阻塞状态不同),进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒(由于notify()只是唤醒一个线程,但我们由不能确定具体唤醒的是哪一个线程,也许我们需要唤醒的线程不能够被唤醒,因此在实际使用时,一般都用notifyAll()方法,唤醒有所线程),线程被唤醒后会进入锁池,等待获取锁标记。

5、死亡状态

线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

二、进程的状态

进程是系统进行资源分配和调度的基本单位。线程是CPU调度的基本单位

一般来说,进程有三个状态:

1、运行态

进程占用CPU,并在CPU上运行。

2、就绪态

进程已经具备运行条件,但是CPU还没有分配过来。

3、阻塞态

进程因等待某件事发生而暂时不能运行。

上述的三种状态之间转换分为六种情况:

1、运行——>就绪:主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,该进程便由执行状态转变为就绪状态。
2、就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
3、运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
4、阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列

以下两种状态是不可能发生的:

1、阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行挑选,而是从就绪队列中选取
2、就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态。

在一些系统中,又增加了一些新状态,如挂起状态,可运行状态,深度睡眠状态,浅度睡眠状态,暂停状态,僵死状态。

1、可运行状态:运行状态和就绪状态的合并,表示进程正在运行或准备运行,Linux 中使用TASK_RUNNING 宏表示可运行状态。
2、浅度睡眠状态:进程正在睡眠(被阻塞),等待资源的到来是唤醒,也可以通过其他进程信号或时钟中断唤醒,进入运行队列。Linux 中使用TASK_INTERRUPTIBLE 宏表示此状态。
3、深度睡眠状态:其和浅度睡眠基本类似,但不可被其他进程信号或时钟中断唤醒。Linux 中使用TASK_UNINTERRUPTIBLE 宏表示此状态。
4、暂停状态:进程暂停执行接受某种处理。Linux 使用TASK_STOPPED 宏表示此状态。
5、僵死状态:进程已经结束但未释放进程控制块(PCB),Linux 使用TASK_ZOMBIE 宏表示此状态。

挂起状态:在执行状态的进程通过挂起即可进入就绪状态,如图所示,就绪状态和阻塞状态都分为活动态和静止态。由活动态向静止态转换就是通过挂起实现的。

引入挂起状态的原因有:
1、终端用户的请求。当终端用户在自己的程序运行期间发现有可疑问题时,希望暂时使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂不接受调度,以便用户研究其执行情况或对程序进行修改。我们把这种静止状态称为挂起状态。 
2、父进程请求。有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程间的活动。
3、负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行。
4、操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。

线程的状态、进程的状态相关推荐

  1. 进程和线程:进程的状态和层次结构

    进程的状态 三种状态 运行态:该时刻实际占用 CPU 的进程. 就绪态:可运行但还没有被分配时间片.一般在就绪队列中. 阻塞态:除非某种外部事件发生,否则进程无法运行.一般在阻塞队列中. 四种转换关系 ...

  2. linux检查是否有D进程,Linux内核调试技术——进程D状态死锁检测

    Linux的进程存在多种状态,如TASK_RUNNING的运行态.EXIT_DEAD的停止态和 TASK_INTERRUPTIBLE的接收信号的等待状态等等(可在include/linux/sched ...

  3. python创建进程的方法_python进程的状态、创建及使用方法详解

    本文实例讲述了python进程的状态.创建及使用方法.分享给大家供大家参考,具体如下: 进程以及状态 1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资 ...

  4. 线程的生命周期和状态控制

    为什么80%的码农都做不了架构师?>>>    一.线程的生命周期 线程状态转换图: 其中Thread.join()调用的是Object.wait()方法实现的,意思是让当前线程等待 ...

  5. Java并发编程(01):线程的创建方式,状态周期管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.并发编程简介 1.基础概念 程序 与计算机系统操作有关的计算机程序.规程.规则,以及可能有的文件.文档及数据. 进程 进程是计算机中的程序 ...

  6. python进程的状态及创建

    进程以及状态 1. 进程 程序:例如xxx.py这是程序,是一个静态的 进程:一个程序运行起来后,代码+用到的资源 称之为进程,它是操作系统分配资源的基本单元. 不仅可以通过线程完成多任务,进程也是可 ...

  7. 【Linux】僵尸进程(Z状态)和孤儿进程

    先了解下进程都有什么状态: 进程状态:就绪,阻塞,运行 linux下进程状态: 运行状态®:并不意味着进程一定在运行中,它表明进程在运行中,或在运行队列里(只要拿到时间片就能运行) 可中断休眠状态(S ...

  8. 进程的终止方式和进程的状态

    进程的终止方式: 有8种方式使进程终止,其中前5种为正常终止,它们是 1:从 main 返回 2:调用 exit 3:调用 _exit 或 _Exit 4:最后一个线程从其启动例程返回 5:最后一个线 ...

  9. 线程状态:分离状态(detached)与可结合状态(joinable)

    1.在任何一个时间点上,线程是可结合的(joinable),或者是分离的(detached). 一个可结合的线程能够被其他线程收回其资源和杀死:在被其 他线程回收之前,它的存储器资源(如栈)是不释放的 ...

最新文章

  1. 命令行运行Python脚本时传入参数的三种方式
  2. 第3周实践项目7 删除链表元素最大值
  3. 前端学习(2379):调整初始目录结构
  4. 简单理解JSONP的定义及其实现
  5. java restcontroller_Spring框架:@RestController与@Controller
  6. php 使用redis队列简单实用
  7. 水系图一般在哪里找得到_广东工业大学《JACS》:一种全新的高性能水系可充电铝离子电池!...
  8. MAC 终端git提交代码步骤
  9. 【实用】神级工具类Hutool,你值得拥有!
  10. 中小企业生产信息化:私有系统还是云方案?
  11. 圆内接等边三角形的画法_几何画板应用教学,教你绘制圆的内接正三角形
  12. 【剖析 | SOFARPC 框架】之SOFARPC 连接管理与心跳剖析
  13. 防火墙之Iptables与Firewalld
  14. 三重积分(Triple Integral)
  15. RTL8188EUS驱动程序编译步骤
  16. 在线支付系列【4】支付安全之数字签名
  17. 使用 NoSQL 数据库提供云级别数据可伸缩性
  18. Java常见运算符整理
  19. 品牌数字化升级,如何借力用户画像实现精准营销? - whale 帷幄
  20. Eclipse开发工具的基本介绍及使用

热门文章

  1. 录取率查询和申请结果查询平台分享
  2. MVC扩展控制器工厂,通过继承DefaultControllerFactory来决定使用哪个接口实现,使用Ninject...
  3. 《Adobe Photoshop CS6中文版经典教程(彩色版)》—第2课2.4节在Camera Raw中调整颜色...
  4. 嵌入式_makefile简单语法介绍
  5. 外网访问XAMPP失败 解决方案
  6. 【资源】C++学习资料 - 逆天整理 - 精华无密版【最新】
  7. nyoj905 卡片游戏
  8. 设计模式学习笔记(1)之单例模式
  9. 杭电1166敌兵布阵
  10. CodeForce 463C Gargari and Bishops(贪心+暴力)