日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

locklock locklock( 二 )


// 創(chuàng)建線程 2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 先休眠 0.5s,讓線程 1 先執(zhí)行
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取鎖
try {
System.out.println("線程 2:嘗試獲取鎖.");
lock.lockInterruptibly(); // 可中斷鎖
System.out.println("線程 2:獲取鎖成功.");
} catch (InterruptedException e) {
System.out.println("線程 2:執(zhí)行已被中斷.");
}
}
});
t2.start();
// 等待 2s 后,終止線程 2
Thread.sleep(2000);
if (t2.isAlive()) { // 線程 2 還在執(zhí)行
System.out.println("執(zhí)行線程的中斷.");
t2.interrupt();
} else {
System.out.println("線程 2:執(zhí)行完成.");
}
}
}
以上代碼執(zhí)行結(jié)果如下:
從上述結(jié)果可以看出,當(dāng)我們使用了 lockInterruptibly 方法就可以在一段時(shí)間之后,判斷它是否還在阻塞等待,如果結(jié)果為真,就可以直接將他中斷,如上圖效果所示 。?
但當(dāng)我們嘗試將 lockInterruptibly 方法換成 lock 方法之后(其他代碼都不變),執(zhí)行的結(jié)果就完全不一樣了,實(shí)現(xiàn)代碼如下:
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class InterruptiblyExample {
public static void main(String[] args) throws InterruptedException {
Lock lock = new ReentrantLock();
// 創(chuàng)建線程 1
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 加鎖操作
lock.lockInterruptibly();
System.out.println("線程 1:獲取到鎖.");
} catch (InterruptedException e) {
e.printStackTrace();
}
// 線程 1 未釋放鎖
}
});
t1.start();
// 創(chuàng)建線程 2
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
// 先休眠 0.5s,讓線程 1 先執(zhí)行
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 獲取鎖
try {
System.out.println("線程 2:嘗試獲取鎖.");
lock.lock();
System.out.println("線程 2:獲取鎖成功.");
} catch (Exception e) {
System.out.println("線程 2:執(zhí)行已被中斷.");
}
}
});
t2.start();
// 等待 2s 后,終止線程 2
Thread.sleep(2000);
if (t2.isAlive()) { // 線程 2 還在執(zhí)行
System.out.println("執(zhí)行線程的中斷.");
t2.interrupt();
} else {
System.out.println("線程 2:執(zhí)行完成.");
}
}
}
以上程序執(zhí)行結(jié)果如下:
從上圖可以看出,當(dāng)使用 lock 方法時(shí),即使調(diào)用了 interrupt 方法依然不能將線程 2 進(jìn)行中斷 。
總結(jié)
本文介紹了中斷鎖的實(shí)現(xiàn),通過顯示鎖 Lock 的 lockInterruptibly 方法來完成,它和 lock 方法作用類似,但是 lockInterruptibly 可以優(yōu)先接收到中斷的通知,而 lock 方法只能“死等”鎖資源的釋放,同時(shí)這兩個(gè)方法的區(qū)別也是常見的面試題,希望本文對(duì)你有用 。?
作者:Java中文社群原文鏈接:https://juejin.cn/post/7005545939897172005
【locklock locklock】(今完)

推薦閱讀