06.yield
Thread.yield()方法的作用:暂停当前正在执行的线程,并执行其他线程。(可能没有效果) yield()让当前正在运行的线程回到可运行状态,以允许具有相同优先级的其他线程获得运行的机会。因此,使用yield()的目的是让具有相同优先级的线程之间能够适当的轮换执行。但是,实际中无法保证yield()达到让步的目的,因为,让步的线程可能被线程调度程序再次选中。 结论:大多数情况下,yield()将导致线程从运行状态转到可运行状态,但有可能没有效果。
/**
* sleep 与 yield 方法的区别在于,当线程调用 sleep 方法时调用线程会被阻塞挂起指定的时间,
* 在这期间线程调度器不会去调度该线程。 而调用 yield 方法时,线程只是让出自己剩余的时间片,
* 并没有被阻塞挂起,而是处于就绪状态,线程调度器下一次调度时就有可能调度到当前线程执行
*/
public class YieldDemo implements Runnable{
YieldDemo(){
Thread t = new Thread(this);
t.start();
}
@Override
public void run() {
for (int i = 0; i < 5; i++) {
//当 i=O时让出CPU执行权,放弃时间片,进行下一轮调度
if (i%5==0){
System.out.println(Thread.currentThread()+" yield cpu...");
//当前线程让出CPU执行权,放弃时间片,进行下一轮调度
// Thread.yield();
}
}
System.out.println(Thread.currentThread()+" is over");
}
public static void main(String[] args){
new YieldDemo();
new YieldDemo();
new YieldDemo();
//执行多次输出结果样式
//Thread[Thread-0,5,main] yield cpu...
//Thread[Thread-1,5,main] yield cpu...
//Thread[Thread-2,5,main] yield cpu...
//Thread[Thread-0,5,main] is over
//Thread[Thread-1,5,main] is over
//Thread[Thread-2,5,main] is over
//输出了第一行后当前线程让出了 CPU 执行权
//注释Thread.yield();
//执行多次输出结果存在同一线程的两行输出在一起
//Thread[Thread-0,5,main] yield cpu...
//Thread[Thread-0,5,main] is over
//Thread[Thread-1,5,main] yield cpu...
//Thread[Thread-1,5,main] is over
//Thread[Thread-2,5,main] yield cpu...
//Thread[Thread-2,5,main] is over
}
}