控制线程(下)

4、线程让步yield
yield()方法是一个和sleep()方法有点类似的方法,它也是Thread类提供的一个静态方法,它也可以让当前正在执行的线程暂停,但它不会阻塞该线程,只是让该线程进入就绪状态。yield()只是让当前线程暂停一下,让系统的线程调度器重新调度一次。

举个例子:


public class YieldTest extends Thread {

	public YieldTest(String name) {
		super(name);
	}
	
	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(MAX_PRIORITY);
		yt1.start();
		
		YieldTest yt2 = new YieldTest("低级");
		//yt2.setPriority(MIN_PRIORITY);
		yt2.start();			

	}

}

在这里插入图片描述

运行上述代码,结果如上图所示。
两个线程的优先级完全相同,让一个线程执行yield()方法后,另外一个线程就会开始执行。

当设置两个线程的优先级后,结果如下图所示。
在这里插入图片描述

高优先级的线程调用yield()方法暂停之后,系统中没有与之优先级相同,或更高优先级的线程,所以该线程继续执行。

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

  • 1 sleep()方法暂停当前线程之后,会给其他线程执行机会,不会理会其他线程的优先级;但yield()方法只会给优先级相同,或优先级更高的线程执行机会。
  • 2 sleep()方法会将该线程转入阻塞状态,直到经过阻塞时间才会转入就绪状态;而yield()方法不会将该线程转入阻塞状态,它只是强制当前线程进入就绪状态。因此完全有可能某个线程调用yield()方法暂停之后,立即再次获得当前处理器资源被执行。
  • 3 sleep()方法声明则抛出InterruptedException异常,所以调用sleep()方法时要么捕获该异常,要么显示声明抛出该异常;而yield()方法则没有声明抛出任何异常。
  • 4 sleep()方法比yield()方法具有更好的可移植性,通常不建议yield()来控制线程的执行。

5、改变线程的优先级
每个线程执行时具有一定的优先级,优先级高的线程获得更多的执行机会,而优先级低的线程则获得较少的执行机会。

每个线程默认的优先级都与创建它的父线程优先级相同,在默认情况下,main线程具有普通优先级,由main线程创建的子线程也具有普通优先级。

Thread类提供了setPriority(int newPriority)、getPriority()方法来设置和获取线程的优先级,其中setPriority()方法的参数可以是一个整数,范围是0----10之间,也可以是下面三个长量。
MAX_PRIORITY 10
MIN_PRIORITY 0
NORM_PRIORITY 5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值