日期:2014-05-20  浏览次数:20732 次

Java面试问题之三十四
请问Java中的静态方法Thread.yield()有何作用,它在什么时候会被使用?Thread.yield() 与Thread.sleep()这两个方法之间有些什么区别?

答:当线程在运行中执行了Thread类的yield()静态方法,如果此时具有相同优先级的其他线程处于就绪状态,那么yield() 方法将把当前运行的线程放到可运行池中并使另外一个线程运行起来。如果没有相同优先级的可运行线程,则yield() 方法什么也不做。

sleep()方法和yield()方法都是Thread类的静态方法,都会使当前处于运行状态的线程放弃CPU,把运行的机会让给其他线程。但是它们之间具有以下几点的差别:

(1)sleep()方法会给其他线程运行的机会,而不考虑其他线程的优先级,因此会给较低优先级线程运行的机会;yield()方法只会给相同优先级或者更高优先级的线程一个运行的机会。
(2)当线程执行了sleep(long millis)方法后,将转到阻塞状态,参数millis指定睡眠时间;当线程执行了yield()方法后,将转到就绪状态。
(3)sleep()方法声明抛出InterruptedException异常,而yield()方法没有声明抛出任何异常。
(4)sleep()方法比yield()具有更好的可移植行。不能依靠yield()方法来提高程序的并发性能。对于大多数程序员来说,yield()方法的惟一用处就是在测试期间人为地提高程序的并发性能,以发现一些隐藏的错误,但在实际应用中不值得效法!