但当我们尝试将 lockInterruptibly 方法换成 lock 方法之后(其他代码都不变),执行的结果就完全不一样了,实现代码如下:
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; publicclass InterruptiblyExample { public static void main(String[] args) throws InterruptedException { Lock lock = new ReentrantLock(); // 创建线程 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(); // 创建线程 2 Thread t2 = new Thread(new Runnable() { @Override public void run() { // 先休眠 0.5s,让线程 1 先执行 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:执行已被中断."); } } }); t2.start(); // 等待 2s 后,终止线程 2 Thread.sleep(2000); if (t2.isAlive()) { // 线程 2 还在执行 System.out.println("执行线程的中断."); t2.interrupt(); } else { System.out.println("线程 2:执行完成."); } } }
以上程序执行结果如下:
从上图可以看出,当使用 lock 方法时,即使调用了 interrupt 方法依然不能将线程 2 进行中断。