线程状态流转图

  • Java线程内部流转过程
    Java线程内部的状态流转过程是什么样子的,下图给出了一个详细的图例说明。
    (1) Thread t = new Tread(); 当执行到此段代码时,jvm生成一个新的线程对象,此时该线程处于初始状态。
    (2) 当线程处于可运行状态时,该线程未必就能得到立即执行,这取决于该线程是否获得了cpu的运行时间片。当获得了时间片,该线程得到执行,处于运行状态。
    (3) 处于运行状态的线程最理想的情况是run()方法运行结束,或者抛出异常,整个线程结束。实际常常发生的情况是线程的执行过程会进入阻塞或者等待队列中去。
    (4)当线程处于运行状态时,有4种状态可以流转:(1)结束(2)可运行(3)阻塞(4)进入等待池。详见图上标注。这里需要搞明白yield()、sleep()、wait()这些方法的含义。

  • yield()、sleep()的区别
    这两者的都是使得当前线程暂停运行,且都不会释放锁,两者都会在进入对应状态结束后重新执行。区别在于yield放弃当前执行时间,此时同优先级别的线程(非依赖当前锁的线程)可能会得到执行;而sleep则可以让低于自己优先级的线程(非依赖当前锁的线程)得到执行。yield的内部逻辑是:先检测是否有相同优先级别的线程处于可运行状态,如果有让出cup使用权,否则当前线程继续执行。所以yield的线程可能会从可运行状态立即回到运行状态。

  • 两个重要的概念

  • 锁池
    对象myObject已经被某个线程A持有,那么当其他的线程B/C/D等想要来调用myObject的某个加了synchronized的修饰符的方法或者方法块内部有synchronized,此时线程B/C/D就进入了myObject的锁池,这里的池和线程池是一样的概念。

  • 等待池
    首选需要了解下java和线程有关的wait和notify,以及notifyAll()方法的含义。wait、notify(),notifyAll()都是Object类的方法,而不是线程的方法,这么做的目的便于线程控制,因为一个线程可能会涉及到多个锁,把锁设置为对象的属性,更易于控制。
    当线程A获得了myObject的锁后,此时如果调用wait()方法,则线程A会释放掉该锁,此时线程A进入myObject的等待池。注意调用wait方法一定是在synchronized方法中的,因为前提是线程获得了myObject对象的锁。
    线程B/C/D此时会进行锁的争夺,当线程B获得了锁后,并调用notify(),此时线程A会会进入锁池,当前锁池中又线程A/C/D三个线程,至于是哪个来获得锁,由操作系统的调度算法决定。
    wait()、notify()、notifyAll()主要用于多个线程需要相互交互相互依赖的场景,比如生产者消费者,此时锁对象一般是队列。
    所以等待池是当线程主动释放掉锁时会进入一个等待状态的集合。

这里写图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go 语言通过 GMP(Goroutine, M, P) 模型来进行调度,其中 Goroutine 是 Go 语言中的轻量级线程,M(Machine)是 Go 语言运行时的线程,P(Processor)是逻辑处理器,它用于管理 Goroutine 的运行和调度。 Goroutine 会被调度到 M 上执行,M 可以同时运行多个 Goroutine,每个 M 都有一个 P 和一个 G 的队列,P 用于管理和调度 Goroutine,G 队列存储等待运行的 Goroutine,队列中的 Goroutine 按照 FIFO(先进先出)的原则进行调度。 当一个 Goroutine 需要被执行时,P 会从 G 队列中取出一个 Goroutine,将其与一个 M 绑定,然后再将 M 放入运行队列中等待 CPU 执行。当一个 Goroutine 阻塞时,P 会将其从 M 上摘下,然后将其放入等待队列中等待下一次调度。 在 GMP 模型中,M 和 P 之间有三种状态(Running、Idle、Blocked),M 和 G 之间也有三种状态(Running、Runnable、Waiting): - M 的 Running 状态表示该 M 正在执行 Goroutine; - M 的 Idle 状态表示该 M 没有 Goroutine 可以执行; - M 的 Blocked 状态表示该 M 正在等待某些事件的发生,比如等待 Goroutine 阻塞或等待系统资源; - G 的 Running 状态表示该 Goroutine 正在被某一个 M 执行; - G 的 Runnable 状态表示该 Goroutine 准备好被执行,但是还没有被 M 取走; - G 的 Waiting 状态表示该 Goroutine 正在等待某些事件的发生,比如等待 I/O 完成或等待定时器超时。 总之,GMP 模型是 Go 语言调度的核心,它的状态流转是 Go 语言进行调度的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值