1. yield 与 sleep
https://blog.csdn.net/yiifaa/article/details/75578505
在JAVA并发程序的开发中,经常会用到这两个方法对程序进行测试,它们的相同点在于:
- 都会暂缓执行当前线程;
- 如果已经持有锁,那么在等待过程中都不会释放锁;
不同点在于:
- Thread.sleep()可以精确指定休眠的时间,而Thread.yield()依赖于CPU的时间片划分,在我的电脑上大约为20微秒;
- Thread.sleep()会抛出中断异常,且能被中断,而Thread.yield()不可以;
public class YieldSleepTest {
static class YieldLock extends Thread{
private Object monitor;
public YieldLock(Object monitor) {
this.monitor = monitor;
}
@Override
public void run() {
synchronized (monitor) {
while (true) {
System.out.println(this.getClass().getName() + ": got the lock");
Thread.yield();
}
}
}
}
static class SleepLock extends Thread {
private Object monitor;
public SleepLock(Object monitor) {
this.monitor = monitor;
}
@Override
public void run() {
synchronized (monitor) {
while (true) {
System.out.println(this.getClass().getName() + ": got the lock");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public static void main(String[] args) {
final Object monitor = new Object();
new YieldLock(monitor).start();
// 如果 YieldLock 先执行,其不会释放锁,不管是否显式地调用 Thread.yield();,仍会持有锁。
new SleepLock(monitor).start();
// 如果是 SleepLock 先执行,其也不会释放锁,不管是否显式地调用 Thread.sleep;,仍会持有锁;
}
}