【线程基础】【五】yield、sleep、wait方法的异同

发布时间 2023-04-18 22:09:48作者: 酷酷-

1  前言

本节我们讲下Thread.yield()方法的作用,并对比下sleep()方法、wait()方法,看看三者有何区别。

2  yield 方法

作用是:提出释放CPU时间片的请求,不会释放锁,主要知道它不会阻塞线程即可哈,平时我是没怎么用过哈。
特点就是:
(1)yield()方法只是提出申请释放CPU资源,至于能否成功释放由JVM决定。
(2)调用了yield()方法后,线程依然处于RUNNABLE状态,线程不会进入堵塞状态。
(3)调用了yield()方法后,线程处于RUNNABLE状态时,线程就保留了随时被调度的权利。

3  yield 方法与 sleep 方法的区别

yield()方法调用后线程处于RUNNABLE状态,而sleep()方法调用后线程处于TIME_WAITING状态,所以yield()方法调用后线程只是暂时的将调度权让给别人,但立刻可以回到竞争线程锁的状态;而sleep()方法调用后线程处于阻塞状态。

4  sleep 方法与 wait 方法的区别

sleep()方法的特点就是:(1)使线程进入WAITING状态(2)不会占用CPU资源(3)不释放锁(4)响应中断
那么跟 wait 方法的异同点:
相同点:(1)都可以使阻塞线程(2)都可以响应中断
不同点:
(1)wait()notify()方法必须写在同步方法中,是为了防止死锁和永久等待,使线程更安全,而sleep()方法不需要有这个限制。
(2)wait()方法调用后会释放锁sleep()方法调用后不会释放锁。
(3)sleep()方法必须要指定时间参数;wait()方法可以不指定时间参数。
(4)两个方法所属类不同,sleep()方法属于Thread类;wait()属于Object类中,放在Object类中是因为Java中每个类都可以是一把锁。

5  小结

本节简单介绍了下yield方法,以及和sleep、wait方法的区别,主要是理解状态的转变以及锁的释放哈,有理解不对的地方欢迎指正哈。