线程原理探究

    欢迎大家访问handsomecui的博客,转载请注明地址https://www.cnblogs.com/handsomecui,欢迎加入技术群讨论:778757421

 

 一、介绍:

1
2
3
4
5
6
7
8
当实例化一个线程之后,首先进入初始状态,即New状态,此时线程在启动的时候并不是立刻就运行,
而是要等到操作系统调度之后才运行,然后调用start()进入运行状态,即runnable,
其中运行状态中包括运行(running)和就绪(ready)两种状态,
这两种状态在操作系统的调度下可以互相转换,如果运行中的线程时间片被CPU抢占的话就会变成就绪状态;
运行中的线程通过调用synchronized方法或synchronized块进入阻塞状态,即blocked,当线程获取到锁之后进入运行状态;
如果线程在执行过程中调用了sleep(),wait().join(),Locksupported.parkUtil()等方法时,会进入等待状态(waiting)或超时等待状态,即timed_waiting,
再次调用notify(),notifyAll(),Locksupported.unpark()等方法时,又会重新进入运行时状态,
当线程执行完成时,就进入了终止状态,即terminated状态。
  1. wating和blocked区别:
    1
    2
    3
    与wating状态相关联的是等待队列,与blocked状态相关的是同步队列,
    一个线程由等待队列迁移到同步队列时,线程状态将会由wating转化为blocked。
    可以这样说,blocked状态是处于wating状态的线程重新焕发生命力的必由之路。
  2. BLOCKED,WAITING,TIMED_WAITING区别:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    https://www.jianshu.com/p/0976b2f23db1
    BLOCKED: 这种状态是指一个阻塞线程在等待monitor锁。
    当线程调用Object#wait()方法进入一个synchronized块/方法或重进入一个synchronized锁/方法时会等待获取monitor锁。
    WAITING: 一个线程在等待另一个线程执行一个动作时在这个状态
    1. Object#wait() 而且不加超时参数
    2. Thread#join() 而且不加超时参数
    3. LockSupport#park()
    TIMED_WAITING: 一个线程在一个特定的等待时间内等待另一个线程完成一个动作会在这个状态
    * Thread#sleep()
    * Object#wait() 并加了超时参数
    * Thread#join() 并加了超时参数
    * LockSupport#parkNanos()
    * LockSupport#parkUntil()
二、同步队列和阻塞队列
 
 

 

posted @   handsomecui  阅读(134)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2016-09-30 matlab学习
点击右上角即可分享
微信分享提示