对于ReentrantLock,实际使用lockInterruptibly

你实际上对这个方法使用了什么lockInterruptibly ? 我已阅读API,但对我来说不是很清楚。 换句话说,有人可以表达吗?

逻辑与所有可中断的阻塞方法相同:它允许线程立即对从另一个线程发送给它的interrupt信号作出反应。

如何使用此特定function取决于应用程序设计。 例如,它可以用于杀死池中的所有线程,这些线程都在等待获取锁。

如果锁已被另一个线程持有,则lockInterruptibly()可能会阻塞,并等待锁被获取。 这与常规lock() 。 但是如果另一个线程中断了等待的线程, lockInterruptibly()将抛出InterruptedException

尝试通过下面的代码示例来理解这个概念。

代码示例:

 package codingInterview.thread; import java.util.concurrent.locks.ReentrantLock; public class MyRentrantlock { Thread t = new Thread() { @Override public void run() { ReentrantLock r = new ReentrantLock(); r.lock(); System.out.println("lock() : lock count :" + r.getHoldCount()); interrupt(); System.out.println("Current thread is intrupted"); r.tryLock(); System.out.println("tryLock() on intrupted thread lock count :" + r.getHoldCount()); try { r.lockInterruptibly(); System.out.println("lockInterruptibly() --NOt executable statement" + r.getHoldCount()); } catch (InterruptedException e) { r.lock(); System.out.println("Error"); } finally { r.unlock(); } System.out.println("lockInterruptibly() not able to Acqurie lock: lock count :" + r.getHoldCount()); r.unlock(); System.out.println("lock count :" + r.getHoldCount()); r.unlock(); System.out.println("lock count :" + r.getHoldCount()); } }; public static void main(String str[]) { MyRentrantlock m = new MyRentrantlock(); mtstart(); System.out.println(""); } } 

输出:

 lock() : lock count :1 Current thread is intrupted tryLock() on intrupted thread lock count :2 Error lockInterruptibly() not able to Acqurie lock: lock count :2 lock count :1 lock count :0