线程状态转移模型

一,简介

       线程有新建,就绪,运行,阻塞,死亡5种状态。其中线程阻塞指的是暂停一个线程继续向下执行以等待某个条件发生(如某资源就绪等)。

 

二,状态转移模型

     
线程状态转移模型
 

通常引起一个运行线程进入阻塞状态的方法有:sleep(),join(),wait()等

   1)   sleep() 方法:sleep() 允许指定以毫秒为单位的一段时间作为参数,它使得线程在指定的时间内进入阻塞状态,不能得到CPU 调度执行,指定的时间一过,线程重新进入可执行状态(就绪状态)。等待CPU的调度执行(从阻塞点继续向下执行)。

   2)   join()方法:可以将两个交替执行的线程合并为顺序执行。比如在线程B中调用了线程Ajoin()方法,直到线程A执行完毕后,才会继续执行线程B,在调用A.join()时,线程B进入阻塞状态,当线程A执行完毕以后,线程B才会从阻塞状态变为就绪状态,等待CPU的调度执行。join(time)方法:传入等待的时间参数time,在该时间time内,线程B处于阻塞状态,过了指定的时间以后,线程B变为就绪状态(不管线程A是否执行完毕)

  3)   wait()方法:使当前线程暂停执行,进入阻塞状态并释放锁标志,让其他线程可以进入Synchronized数据块,当前线程被放入对象(调用wait方法的那个对象)等待池中。当调用notify()方法后,将从对象的等待池中移走一个任意的线程并放到锁标志等待池中,只有锁标志等待池中的线程能够获取锁标志;如果对象等待池中没有线程,则notify()不起作用。notifyAll()则从对象等待池中移走所有等待那个对象的线程并放到锁标志等待池中。由此可以看出:对象等待池和锁标志等待池中的线程都是处于阻塞状态的只有当锁标志等待池中的阻塞线程得到锁以后,才会变为就绪状态,等待CPU的调度执行。

  4)yield()方法只是让运行线程转为就绪状态,进入就绪线程池中,再次等待CPU的调度执行,并不是让线程进入阻塞状态。这也就是为什么yield()方法只能让相同(或者更高)优先级的线程有执行的机会(CPU线程调度方式:按优先级抢占式调度),而sleep()则可以让比其低优先级的线程有执行的机会。

 

三,总结

  sleep(),join()iO等待,这种状态下线程不会释放获得的锁wait()会释放获得的锁