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