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

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()方法来控制并发线程的执行。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值