在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