您的位置:首页 > 编程语言 > Java开发

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

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

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()方法,该线程结束生命周期,结束的线程不能再次被运行。

如图

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

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

怎么把对象锁收回来呢?

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

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

join()
join()方法使当前线程停下来等待,直至另一个调用join方法的线程终止。值得注意的是,线程的在被激活后不一定马上就运行,而是进入到可运行线程的队列中。但是join()可以通过interrupt()方法打断线程的暂停状态,从而使线程立刻抛出InterruptedException。

yield()
Yield()方法是停止当前线程,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。

interrupt()
interrupt()中断线程。需要注意的是,InterruptedException是线程自己从内部抛出的,并不是interrupt()方法抛出的。对某一线程调用interrupt()时,如果该线程正在执行普通的代码,那么该线程根本就不会抛出InterruptedException。但是,一旦该线程进入到wait()/sleep()/join()后,就会立刻抛出InterruptedException。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 线程
相关文章推荐