在JAVA并发程序的开发中,经常会用到这两个方法对程序进行测试,它们的相同点在于:
1. 都会暂缓执行当前线程;
2. 如果已经持有锁,那么在等待过程中都不会释放锁;
不同点在于:
1. Thread.sleep()可以精确指定休眠的时间,而Thread.yield()依赖于CPU的时间片划分,在我的电脑上大约为20微秒;
2. Thread.sleep()会抛出中断异常,且能被中断,而Thread.yield()不可以;
示例程序如下:
package wede.javaPro;
static class YieldLock extends Thread {
private Object monitor;
/**
* @param monitor
*/
@Inject
public YieldLock(Object monitor) {
this.monitor = monitor;
}
public void run() {
synchronized (monitor) {
while (true) {
Thread.yield();
}
}
}
}
static class MonitorLock extends Thread {
private Object monitor;
/**
* @param monitor
*/
@Inject
public MonitorLock(Object monitor) {
this.monitor = monitor;
}
public void run()
{
try {
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
synchronized (monitor) {
System.out.println("我能拿到锁!");
}
}
}
/**
* @param args
*/ public static void main(String[] args) {
final Object monitor = new Object();
new YieldLock(monitor).start();
// 下面的这个线程永远拿不到锁
// 所以也不会输出"我能拿到锁!"这句话 new MonitorLock(monitor).start(); }
}
转自:https://blog.csdn.net/yiifaa/article/details/75578505
