编 程 的 朝 圣 之 路

----------------------------------------

当程序中包含多个线程时,CPU 不是一直被特定的线程霸占,而是轮流执行各个线程。

那么,CPU 在轮换执行线程的过程中,即从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建、就绪、运行、阻塞和死亡。

线程的新建状态

无论是通过 Thread 类直接实例化对象创建线程,还是通过继承自 Thread 类的子类实例化创建线程,新创建的线程在调用 start() 方法之前,不会得到执行,此阶段的线程就处于新建状态。

线程的就绪状态

当位于新建状态的线程调用 start() 方法后,该线程就转换到就绪状态。

所谓就绪,就是告诉 CPU,该线程已经可以执行了,但是具体什么时候执行,取决于 CPU 什么时候调度它。

换句话说,如果一个线程处于就绪状态,只能说明此线程已经做好了准备,随时等待 CPU 调度执行,并不是说执行了 start() 方法此线程就会立即被执行。

线程的运行状态

当位于就绪状态的线程得到了 CPU,并开始执行 target 参数执行的目标函数或者 run() 方法,就表明当前线程处于运行状态。

但如果当前有多个线程处于就绪状态(等待 CPU 调度)时,处于运行状态的线程将无法一直霸占 CPU 资源,为了使其它线程也有执行的机会,CPU 会在一定时间内强制当前运行的线程让出 CPU 资源,以供其他线程使用。

线程的阻塞状态

当 CPU 对多个线程进行调度时,对于获得 CPU 调度却没有执行完毕的线程,就会进入阻塞状态。

目前几乎所有的桌面和服务器操作系统,都采用的是抢占式优先级调度策略。即 CPU 会给每一个就绪线程一段固定时间来处理任务,当该时间用完后,系统就会阻止该线程继续使用 CPU 资源,让其他线程获得执行的机会。

对于具体选择那个线程上 CPU,不同的平台采用不同的算法,比如先进先出算法(FIFO)、时间片轮转算法、优先级算法等,每种算法各有优缺点,适用于不同的场景。

除此之外,如果处于运行状态的线程发生如下几种情况,也将会由运行状态转到阻塞状态:

  • 线程调用了 sleep() 方法;
  • 线程等待接收用户输入的数据;
  • 线程试图获取某个对象的同步锁时,如果该锁被其他线程所持有,则当前线程进入阻塞状态;
  • 线程调用 wait() 方法,等待特定条件的满足。

以上几种情况都会导致线程阻塞,只有解决了线程遇到的问题之后,该线程才会由阻塞状态转到就绪状态,继续等待 CPU 调度。

以上 4 种可能发生线程阻塞的情况,解决措施分别如下:

  • sleep() 方法规定的时间已过;
  • 线程接收到了用户输入的数据;
  • 其他线程释放了该同步锁,并由该线程获得;
  • 调用 set() 方法发出通知。

线程死亡状态

对于获得 CPU 调度却未执行完毕的线程,它会转入阻塞状态,待条件成熟之后继续转入就绪状态,重复争取 CPU 资源,直到其执行结束。

执行结束的线程将处于死亡状态。

线程执行结束,除了正常执行结束外,如果程序执行过程发生异常(Exception)或者错误(Error),线程也会进入死亡状态。

对于处于死亡状态的线程,有以下 2 点需要注意:

  • 主线程死亡,并不意味着所有线程全部死亡。也就是说,主线程的死亡,不会影响子线程继续执行;反之也是如此。
  • 对于死亡的线程,无法再调用 start() 方法使其重新启动,否则 Python 解释器将抛出 RuntimeError 异常。

python高级用法_iOS-创客学院​www.makeru.com.cn

pthread_create函数阻塞了主线程_5个状态,Python 中线程的生命周期相关推荐

  1. Python中线程间通信

    Python中线程间通信 一.前言 二.什么是互斥锁 三.使用互斥锁 四.使用队列在线程间通信 五.关于线程需要注意的两点 一.前言   我们已经知道进程之间不能直接共享信息,那么线程之间可以共享信息 ...

  2. python中线程和进程_python中线程和进程的简单了解

    一.操作系统.应用程序 1.硬件:硬盘.cpu.主板.显卡........ 2.装系统(本身也是一个软件): 系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合. 3 ...

  3. Java多线程系列(二):线程的五大状态,以及线程之间的通信与协作

    在Java面试的时候,经常会问到Java并发编程相关的多线程.线程池.线程锁.线程通信等面试必考点,比如: Java并发编程系列:Java线程池的使用方式,核心运行原理.以及注意事项 Java并发编程 ...

  4. python中线程里面多线程_Python中的线程和多线程是什么

    一.线程的概念 一个进程里面至少有一个控制线程,进程的概念只是一种抽象的概念,真正在CPU上面调度的是进程里面的线程,就好比真正在地铁这个进程里面工作的实际上是地铁里面的线程,北京地铁里面至少要有一个 ...

  5. python协程是什么_在python中线程和协程的区别是什么

    在python中线程和协程的区别:1.一个线程可以拥有多个协程,这样在python中就能使用多核CPU:2.线程是同步机制,而协程是异步:3. 协程能保留上一次调用时的状态,每次过程重入时,就相当于进 ...

  6. java线程6种状态转换,Java线程的生命周期和各种状态转换详解

    在Java中,任何对象都有生命周期,线程也不例外,它也有自己的生命周期.当Thread对象创建完成时,线程的生命周期便开始了,当线程任务中代码正常执行完毕或者线程抛出一个未捕获的异常(Exceptio ...

  7. python中线程同步_Python线程同步在实际应用中功能体现

    在Python编程语言中,对于线程的操作是一个比较重要的应用技术.我们将会在这篇文章中为大家详细介绍一下这方面的相关基础内容,Python线程同步的应用方式.多个执行线程经常要共享数据,如果仅仅读取共 ...

  8. 如何改变 Python 中线程的执行顺序

    一.主线程会等待所有的子线程结束后才结束 首先我看下最普通情况下,主线程和子线程的情况. import threading from time import sleep, ctimedef sing( ...

  9. Python中线程Timeout的使用

    Python中关于Timeout有另一种用起来更简便的方法,即使用装饰器.这种方式是使用sys模块的settrace等方法重构了python的threading类: #!/usr/bin/python ...

最新文章

  1. java中json重复数据结构_JS实现去除数组中重复json的方法示例
  2. make--变量与函数的综合示例 自动生成依赖关系
  3. NOT NULL列用IS NULL也能查到数据?
  4. java mp3播放器 ×××面
  5. Linux6.x修改出eth0网卡的解决方法
  6. Visual Studio代码中的多个游标[关闭]
  7. Eigrp恶意插入路由和致瘫***测试(四)
  8. ECCV 2020 亮点摘要(上)
  9. Vue动态类名的实现
  10. vue-quill-editor 获取无法获取光标位置
  11. Java中堆和栈的概念与区别
  12. CG之菲涅尔效果简单实现
  13. torch 默认参数初始化_Detection学习之九-torch中如何定义优化器及调整学习率
  14. linux ext4分区无损扩容,linux操作系统无损升级文件系统ext3至ext4--数据盘篇
  15. qt5 tcp服务器编程 多固定客户_服务器与客户端进程之间端口号联系
  16. f1c200s核心板_F1C200s NS 2009 驱动
  17. uni-app 启动手机模拟器
  18. 一招,提高 Github 成员微信群运营效率
  19. 搞一下整车以太网技术 | 04 CBS基于信用整形
  20. 【R语言 数据挖掘】R语言如何做关联规则?

热门文章

  1. g++: command not found的解决
  2. 区县政府网站群建设新思路
  3. 使用Marshal.Copy把Txt行数据转为Struct类型值
  4. 小白学数据分析-----数据指标 累计用户数的使用
  5. 在linux下编译boost库【搜集】
  6. “元宇宙” 是什么东西?
  7. 你想要的江湖,可能不在这时候笑傲
  8. 没有梦想,你跟咸鱼有什么分别?
  9. Linux Android 常用shell命令汇总 不断更新
  10. cassandra可视化工具_一位数据科学家的私房工具清单