lock 與 lockInterruptibly比較區別在於:
lock 優先考慮獲取鎖,待獲取鎖成功后,才響應中斷。
lockInterruptibly 優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。
詳細區別:
ReentrantLock.lockInterruptibly允許在等待時由其它線程調用等待線程的Thread.interrupt方法來中斷等待線程的等待而直接返回,這時不用獲取鎖,而會拋出一個InterruptedException。 ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測到Thread.isInterrupted,一樣會繼續嘗試獲取鎖,失敗則繼續休眠。只是在最后獲取鎖成功后再把當前線程置為interrupted狀態,然后再中斷線程。
看一下測試代碼如下:
-
class MyThread05 extends Thread{
-
public void test3() throws Exception{
-
final Lock lock = new ReentrantLock();
-
lock.lock();
-
Thread.sleep( 1000);
-
Thread t1 = new Thread(new Runnable(){
-
-
public void run() {
-
lock.lock();
-
// try {
-
// lock.lockInterruptibly();
-
// } catch (InterruptedException e) {
-
// // TODO Auto-generated catch block
-
// e.printStackTrace();
-
// }
-
System.out.println(Thread.currentThread().getName()+ " interrupted.");
-
}
-
});
-
t1.start();
-
Thread.sleep( 1000);
-
t1.interrupt();
-
Thread.sleep( 1000000);
-
}
-
}
這里使用的是lock()方法,在主程序中執行test3()方法后回發現,即使執行了interrupt()方法也沒有反應。
將注釋代碼取消掉,我們會發現,程序要求捕捉該異常