sleep
sleep方法是Thread类中的,不会释放锁,只会阻塞线程,可中断,sleep给其它线程运行机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会。
wait
wait方法是Object类中的,会释放对象锁,只有当其它线程调用notify才能唤醒此线程。使用wait方法时必须先获取对象锁,即必须在synchronized修饰的代码块中使用,那么相应的notify方法同样必须在synchronized修饰的代码块中使用。
yield
让当前处于运行状态的线程退回到可运行状态,让出抢占资源的机会。和sleep方法一样也是Thread类中的方法,暂停当前正在执行的线程对象,不会释放资源锁,和sleep不同的是yield方法并不会让线程进入阻塞状态,而是让线程重回就绪状态,它只需要等待重新获取CPU执行时间,所以yield的线程有可能在进入到可执行状态后马上又被执行。值得注意的是yield方法只能使用同优先级或更高优先级的线程有执行的机会。
join
在调用join方法的线程执行结束之后,程序再继续执行,一般用于等待异步线程执行结束之后才能继续运行的场景。如一个主线程需要用到子线程的执行结果。
sleep和wait的区别
1.sleep属于Thread类中的static方法,而wait属于Object方法。
2.sleep在Java线程状态中属于TIMED_WAITING时间等待状态,是可以自动被唤醒的,而wait属于WAITING等待状态,需要手动唤醒。
3.sleep方法在执行后不会释放锁资源,而wait方法在执行后会释放锁资源。
4.sleep方法在持有或者不持有锁时都可以直接执行,而wait方法必须在持有锁时才可以执行。
为什么wait方法必须要持有锁?
因为wait方法会将持有锁的线程从Owner仍到WaitSet集合中,这个操作是在修改ObjectMonitor对象,如果没有持有synchronized锁的话,是无法操作ObjectMonitor对象的。
本文详细解析了Java中Thread类的sleep方法,Object类的wait方法,yield方法的作用与区别,以及join方法的用途。重点强调了sleep和wait在锁和唤醒机制上的差异,以及yield如何让高优先级线程有机会执行。
748

被折叠的 条评论
为什么被折叠?



