多线程(三)线程控制之线程让步

来源:互联网 发布:流程优化的意义 编辑:程序博客网 时间:2024/05/18 00:43

yield()方法是一个和sleep()方法有点类似的方法,它也是Thread类提供的一个静态方法,它可以让当前正在执行的线程暂停,但它不会阻塞该线程,它只是将该线程转入就绪状态。yield()只是让当前线程暂停一下,让系统的线程调度器重新调度一次,完全可能的情况是:当某个线程调用了yield()方法暂停之后,线程调度器又将其调度出来重新执行。

实际上,当某个线程调用yield()方法暂停之后,只要优先级与当前线程相同,或者优先级比当前线程更高的处于就绪状态的线程才会获得执行的机会。

package gblw.fisrt;public class YieldTest extends  Thread{public YieldTest(String name){super(name);}//定义run()方法作为线程执行体public void run(){for(int i=0;i<50;i++){System.out.println(getName()+" "+i);//当i等于20时,使用yield()方法让当前线程让步if(i==20){Thread.yield();}}}public static void main(String[] args) {//启动两个并发线程YieldTest yt1=new YieldTest("高级");//将yt1线程设置成最高优先级yt1.setPriority(Thread.MAX_PRIORITY);yt1.start();YieldTest yt2=new YieldTest("低级");yt2.setPriority(Thread.MIN_PRIORITY);yt2.start();}}

在多CPU并行的环境下,yield()方法的功能有时候并不明显,如果读者使用多CPU机器运行上面程序,则可能不能很明显看出效果。

关于sleep()方法和yield()方法的区别如下。

A、sleep()方法暂停当前线程后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级相同,或优先级更高的线程执行机会。

B、sleep()方法会将线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态;而yield()不会将线程转入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用yield()方法暂停之后,立即再次获得处理器资源被释放。

C、sleep()方法声明抛出了InterruptedException异常,所以调用sleep()方法时要么捕捉该异常,要么显式声明抛出该异常;而yield()方法则没有声明抛出任何异常。

D、sleep()方法比yield()方法有更好的可移植性,通常不建议使用yield()方法来控制并发线程的执行。


0 0
原创粉丝点击