线程原理探究_系统调度


一、介绍:


当实例化一个线程之后,首先进入初始状态,即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区别: ​​与wating状态相关联的是等待队列,与blocked状态相关的是同步队列,一个线程由等待队列迁移到同步队列时,线程状态将会由wating转化为blocked。 可以这样说,blocked状态是处于wating状态的线程重新焕发生命力的必由之路。 ​
  2. BLOCKED,WAITING,TIMED_WAITING区别: ​​https://www.jianshu.com/p/0976b2f23db1BLOCKED: 这种状态是指一个阻塞线程在等待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() ​