sleep(),wait(),yield()总结

本文深入探讨了线程的四种状态(产生、可执行、死亡、停滞),以及sleep、wait、yield等关键方法的区别与应用,揭示了它们在多线程编程中的重要角色。

sleep意思是当前正在被服务的线程需要睡一会,醒来之后继续被服务,但是锁不会释放,同是也不需要再同步代码块种调用,同是sleep是一个静态方法,所以t.sleep(),起作用的不是t线程,而是当前线程。sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。

wait()会释放掉同步锁,因此必须是拥有锁才可以,所以需要在同步代码块中调用,在等待时间过去后重新获得锁并回到之前的状态。回收锁有两种情况,一种是等时间到自动回收,另外一种是借出去的人通知我回收锁,即notify和notifyall方法。notify()唤醒在此对象监视器上等待的单个线程。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程将等待从锁池中获得机锁,然后回到wait()前的中断现场。

yield是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。




各个方法之间的区别

线程方法名称是否释放同步锁是否需要在同步的代码块中调用方法是否已废弃是否可以被中断
sleep()
wait()
suspend   
resume()   
join()  



线程有四种状态,任何一个线程肯定处于这四种状态中的一种:
1) 产生(New):线程对象已经产生,但尚未被启动,所以无法执行。如通过new产生了一个线程对象后没对它调用start()函数之前。
2) 可执行(Runnable):每个支持多线程的系统都有一个排程器,排程器会从线程池中选择一个线程并启动它。当一个线程处于可执行状态时,表示它可能正处于线程池中等待排排程器启动它;也可能它已正在执行。如执行了一个线程对象的start()方法后,线程就处于可执行状态,但显而易见的是此时线程不一定正在执行中。
3) 死亡(Dead):当一个线程正常结束,它便处于死亡状态。如一个线程的run()函数执行完毕后线程就进入死亡状态。
4) 停滞(Blocked):当一个线程处于停滞状态时,系统排程器就会忽略它,不对它进行排程。当处于停滞状态的线程重新回到可执行状态时,它有可能重新执行。如通过对一个线程调用wait()函数后,线程就进入停滞状态,只有当两次对该线程调用notify或notifyAll后它才能两次回到可执行状态。

sleep意思是当前正在被服务的线程需要睡一会,醒来之后继续被服务,但是锁不会释放,同是也不需要再同步代码块种调用,同是sleep是一个静态方法,所以t.sleep(),起作用的不是t线程,而是当前线程。sleep()可使优先级低的线程得到执行的机会,当然也可以让同优先级和高优先级的线程有执行的机会。

wait()会释放掉同步锁,因此必须是拥有锁才可以,所以需要在同步代码块中调用,在等待时间过去后重新获得锁并回到之前的状态。回收锁有两种情况,一种是等时间到自动回收,另外一种是借出去的人通知我回收锁,即notify和notifyall方法。notify()唤醒在此对象监视器上等待的单个线程。当它被一个notify()方法唤醒时,等待池中的线程就被放到了锁池中。该线程将等待从锁池中获得机锁,然后回到wait()前的中断现场。

yield是当前正在被服务的线程可能觉得cpu的服务质量不够好,于是提前退出,让同等优先权的线程运行。如果没有同等优先权的线程,那么Yield()方法将不会起作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值