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