java控制线程(三)
2019-01-13 本文已影响0人
RoundYuan
通常用来暂停程序的执行。
下面程序调用sleep()方法来暂停主线程的执行,因为该线程只有一个主线程,当主线程进入睡眠后,系统没有
可执行的线程,所以可以看到程序在sleep()方法暂停。
线程让步:yield
yield()方法是一个和sleep()方法有点类似的方法,它也是Thread类提供的一个静态方法,它也可以让当前正在
执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。
yield()只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:
当某个线程调用了yield()方法暂定之后,线程调度器又将其调度出来重新执行。
sleep和yield的区别:
1、sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级,只会给优先级相同,或
优先级更高的线程执行机会。
2、sleep方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态;而yield不会将线程转入阻塞状态,
它只是强制将当前线程进入就绪状态。因此完全有可能某个线程调用yield()方法暂停后,立即再次获得处理器资源被
执行了。
3、sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显示的抛出该异常
而yield()方法则没有声明抛出任何异常。
4、sleep()方法比yield()方法有更好的可移植性,通常不建议使用yield方法来控制并发线程的执行。
sleep是俄罗斯总统普京,告诉梅德韦杰夫我下去缓两年,然后我再回来再当总统
而yield,则是一个虚伪的官员告诉大家这个我先卸任咱公平竞争,但是只有和你同一级,或高级的才有资格竞争