yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保在当前线程调用yield方法之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!
Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。
为了更好地理解yield()函数的工作过程,我们先来了解线程调度和线程优先级:
1.记住当线程的优先级没有指定时,所有线程都携带普通优先级。
2.优先级可以用从1到10的范围指定。10表示最高优先级,1表示最低优先级,5是普通优先级。
3.记住优先级最高的线程在执行时被给予优先。但是不能保证线程在启动时就进入运行状态。
4.与在线程池中等待运行机会的线程相比,当前正在运行的线程可能总是拥有更高的优先级。
5.由调度程序决定哪一个线程被执行。
6.t.setPriority()用来设定线程的优先级。
7.记住在线程开始方法被调用之前,线程的优先级应该被设定。
8.你可以使用常量,如MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY来设定优先级
相对应的,让我们列举一下关于yield方法的定义重要的几点:
1.Yield是一个静态的原生(native)方法
2.Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。
3.Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态
4.它仅能使一个线程从运行状态转到可运行状态,而不是等待或阻塞状态。
然后我们看下面的例子:
public class YieldExcemple {
public static void main(String[] args) {
Thread threada = new ThreadA();
Thread threadb = new ThreadB();
// 设置优先级:MIN_PRIORITY最低优先级1;NORM_PRIORITY普通优先级5;MAX_PRIORITY最高优先级10
threada.setPriority(Thread.MIN_PRIORITY);
threadb.setPriority(Thread.MAX_PRIORITY);
threada.start();
threadb.start();
}
}
class ThreadA extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("ThreadA--" + i);
Thread.yield();
}
}
}
class ThreadB extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("ThreadB--" + i);
Thread.yield();
}
}
}
本以为运行结果如下:
ThreadB--0
ThreadA--0
ThreadB--1
ThreadA--1
ThreadB--2
ThreadA--2
ThreadB--3
ThreadA--3
ThreadB--4
ThreadA--4
ThreadB--5
ThreadA--5
ThreadB--6
ThreadA--6
ThreadB--7
ThreadA--7
ThreadB--8
ThreadA--8
ThreadB--9
ThreadA--9
结果却出现了多种情况,如下:
ThreadB--0
ThreadB--1
ThreadB--2
ThreadB--3
ThreadB--4
ThreadB--5
ThreadB--6
ThreadB--7
ThreadB--8
ThreadB--9
ThreadA--0
ThreadA--1
ThreadA--2
ThreadA--3
ThreadA--4
ThreadA--5
ThreadA--6
ThreadA--7
ThreadA--8
ThreadA--9
或者
ThreadB--0
ThreadA--0
ThreadB--1
ThreadA--1
ThreadA--2
ThreadA--3
ThreadA--4
ThreadA--5
ThreadA--6
ThreadA--7
ThreadA--8
ThreadA--9
ThreadB--2
ThreadB--3
ThreadB--4
ThreadB--5
ThreadB--6
ThreadB--7
ThreadB--8
ThreadB--9
我们不难看出yield 方法可以很好的控制多线程,在执行某项复杂的任务时,如果担心占用资源过多,可以在完成某个重要的工作后使用 yield 方法让掉当前 CPU 的调度权,等下次获取到再继续执行,这样不但能完成自己的重要工作,也能给其他线程一些运行的机会,避免一个线程长时间占有 CPU 资源。
想要学习更多的Java多线程相关的知识,本站的Java多线程教程是你的不二选择,名师讲解,海量高质量的学习资料全都免费下载,学好Java不再是梦!
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习