yield()方法的作用是:暂停当前正在执行的线程对象,并执行其他线程。注意:这里的其他也包含当前线程。
1.首先继承Thread实现一个子类YieldTest,在它的run方法中执行yield()方法。
class YieldTest extends Thread {
public void run() {
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
System.out.println("YieldTest-run-begin");
System.out.println("YieldTest-1");
YieldAndSleep.calculate();
yield();
System.out.println("YieldTest-2");
YieldAndSleep.calculate();
System.out.println("YieldTest-run-end");
}
}
2.然后继承Thread实现一个子类SleepTest,在它的run方法中执行sleep方法,用来对比yield方法。
class SleepTest extends Thread {
public void run() {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
System.out.println("SleepTest-run-begin");
System.out.println("SleepTest-1");
YieldAndSleep.calculate();
try{
sleep(1000);
} catch (Exception e) {}
System.out.println("SleepTest-2");
YieldAndSleep.calculate();
System.out.println("SleepTest-run-end");
}
}
3.最后分别启动两个YieldTest线程和两个SleepTest线程,观察它们的运行状况
public class YieldAndSleep {
public static void calculate() {
for (int i = 0;i<100000000;i++) {
int j = i*i;
}
}
public static void main(String[] args) {
for (int i = 1; i <= 2; i++) {
System.out.println("YieldTest().start()-begin");
new YieldTest().start();
System.out.println("YieldTest().start()-end");
}
for (int i = 1; i <= 2; i++) {
System.out.println("SleepTest().start()-begin");
new SleepTest().start();
System.out.println("SleepTest().start()-end");
}
}
}
4.看一下运行的结果
YieldTest().start()-begin
YieldTest().start()-end
YieldTest().start()-begin
YieldTest-run-begin
YieldTest-1
YieldTest().start()-end
SleepTest().start()-begin
YieldTest-run-begin
YieldTest-1
SleepTest().start()-end
SleepTest().start()-begin
SleepTest().start()-end
SleepTest-run-begin
SleepTest-1
SleepTest-run-begin
SleepTest-1
YieldTest-2
YieldTest-run-end
YieldTest-2
YieldTest-run-end
SleepTest-2
SleepTest-run-end
SleepTest-2
SleepTest-run-end

每次的运行结果可能都不太一样,就拿这次的来分析一下。可以看到第14行输出SleepTest-1,它是在YieldTest-1之后打印出来的,就是因为在System.out.println("YieldTest-1");之后执行了yield();方法,所以从YieldTest线程转换到了SleepTest线程。当然也有可能还是转换到YieldTest自己这个线程。
THE END.
本文通过创建YieldTest和SleepTest两个线程类,对比分析了Java中yield()方法与sleep方法在多线程调度上的差异。实验结果显示,yield()方法使当前线程放弃CPU使用权,但不指定释放给哪个线程,有可能重新获得执行权。
4191

被折叠的 条评论
为什么被折叠?



