Thread.sleep()与Thread.yield()的区别


在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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM