java 线程的状态分析 sleep yield join wait notify notifyall

java中线程状态分5种,分别为新建,就绪,运行,阻塞,终止。在线程的整个生命周期中,新建和终止只有一次,而就绪,运行,阻塞的次数是不必定的。要实际程序逻辑。java

 

1. 新建:新建立了一个线程对象。
2. 就绪:线程对象建立后,处于就绪状态,等待获取CPU的使用权,准备运行。
3. 运行 :其余线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,就绪状态的线程获取了CPU,执行程序代码。线程

4. 阻塞 :阻塞状态是线程由于某种缘由暂时中止CPU的使用。阻塞的线程要再次被运行,必定要从就绪状态开始,而后才是运行,不能直接从阻塞到运行。对象

阻塞的状况分三种:生命周期

      (1)等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
       (2)同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
       (3)其余阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程从新转入就绪状态。
5. 死亡 :线程执行完了或者因异常退出了run()方法,该线程结束生命周期,结束的线程不能再次被运行。队列

 

如图同步

 

http://s10.sinaimg.cn/large/002F855qgy706p1BpLX49&690

 

Object 对象方法wait()和notify()和notifyAll() it

wait方法则会在线程休眠的同时释放掉锁,让其余线程能够访问该对象。wait()必须在同步的代码块中执行。当一个线程执行到wait()方法时,它就进入到一个和该对象相关的等待池中,同时失去了对象的锁,能够容许其它的线程执行一些同步操做。可是wait()能够经过interrupt方法打断线程的暂停状态,从而使线程马上抛出InterruptedException。
wait可让同步方法或者同步块暂时放弃对象锁,而将它暂时让给其它须要对象锁的人(这里应该是程序块,或线程)用,这意味着可在执行wait()期间调用线程对象中的其余同步方法!在其它状况下(sleep啊,suspend啊)这是不可能的. 可是注意我前面说的,只是暂时放弃对象锁,暂时给其它线程使用,我wait所在的线程仍是要把这个对象锁收回来。
 io

怎么把对象锁收回来呢? 

第一种方法,限定wait的时间.在wait()中设置参数,好比wait(1000),以毫秒为单位,就代表我只借出去1秒中,一秒钟以后,我自动收回. 
第二种方法,让借出去的人通知我,他用完了,要还给我了.这时,我立刻就收回来.假如我设了1小时以后收回,别人只用了半小时,固然是用完了就收回了, 别的线程会调用notify()或notifyAll(),notify()唤醒在此对象监视器上等待的单个线程,notifyAll()唤醒在此对象监视器上等待的全部线程。。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程将等待从锁池中得到锁,而后回到wait()前的中断现场。线程池

 

线程方法  sleep() 
在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操做受到系统计时器和调度程序精度和准确性的影响。
因为sleep()方法是Thread类的方法,所以它不能改变对象的锁。当在一个Synchronized方法中调用sleep方法时,线程虽然休眠了,可是对象的锁没有被释放,其余线程仍然没法访问这个对象。sleep方法不须要在同步的代码块中执行。sleep能够经过interrupt方法打断线程的暂停状态,从而使线程马上抛出InterruptedException。yield

join()  join()方法使当前线程停下来等待,直至另外一个调用join方法的线程终止。值得注意的是,线程的在被激活后不必定立刻就运行,而是进入到可运行线程的队列中。可是join()能够经过interrupt()方法打断线程的暂停状态,从而使线程马上抛出InterruptedException。  yield()  Yield()方法是中止当前线程,让同等优先权的线程运行。若是没有同等优先权的线程,那么Yield()方法将不会起做用。  interrupt()  interrupt()中断线程。须要注意的是,InterruptedException是线程本身从内部抛出的,并非interrupt()方法抛出的。对某一线程调用interrupt()时,若是该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。可是,一旦该线程进入到wait()/sleep()/join()后,就会马上抛出InterruptedException。

相关文章
相关标签/搜索