简介
本节我们讲下Thread.yield()
方法的作用,并对比下sleep()
方法,看看二者有何区别。
一.Thread.yield()方法的作用
作用:提出释放CPU时间片的请求。不会释放锁,线程依然处于RUNNABLE状态。
1.yield()
方法详解
①.yield()
方法只是提出申请释放CPU资源,至于能否成功释放由JVM决定。
由于这个特性,一般编程中用不到此方法,但在很多并发工具包中,yield()
方法被使用,如AQS
、ConcurrentHashMap
、FutureTask
等。
②.调用了yield()
方法后,线程依然处于RUNNABLE
状态,线程不会进入堵塞状态。
什么是堵塞状态
线程状态处于BLOCKED或WAITING或TIME_WAITING这三种统称为堵塞状态
关于线程状态,详见文章《Java线程状态完全解析教程》,我在这篇文章里有详细解析和代码示例,这里不在赘述。
③.调用了yield()
方法后,线程处于RUNNABLE
状态时,线程就保留了随时被调度的权利。
二.yield()
方法和sleep()
方法有什么区别
yield()
方法调用后线程处于RUNNABLE
状态,而sleep()
方法调用后线程处于TIME_WAITING
状态,所以yield()
方法调用后线程只是暂时的将调度权让给别人,但立刻可以回到竞争线程锁的状态;而sleep()
方法调用后线程处于阻塞状态。
关于sleep()
方法的更多讲解,详见《Java中sleep()方法和wait()方法的异同点》。
总结
本文介绍了yield()
方法的作用,分析了调用yield()
方法后其线程状态代表的含义,以及与sleep()
方法做了对比,希望本文能帮到你。