import java.util.concurrent.locks.ReentrantLock; public class MainBoot { public static void main(String[] args) throws Exception { ReentrantLock lock = new ReentrantLock(); lock.lock(); Thread t = new Thread(new A(lock)); t.start(); // 确保t运行了 Thread.sleep(2000); t.interrupt(); //lock.unlock(); System.out.println("main end"); } } class A implements Runnable { ReentrantLock lock; A(ReentrantLock lock) { this.lock = lock; } @Override public void run() { // System.out.println("线程A尝试获取锁"); // 这是不可以中断的 在获取锁过程阻塞,调用interrupt 无法中断selfInterrupt // lock.lock(); try { // 这是可以中断的 检测中断逻辑不同 lock() 只是调用 Thread.currentThread().interrupt(); 清除中断 // lockInterruptibly会抛出异常 // if (shouldParkAfterFailedAcquire(p, node) && // parkAndCheckInterrupt()) // throw new InterruptedException(); lock.lockInterruptibly(); // 获取 超时会抛中断 LockSupport.parkNanos(this, nanosTimeout); 底层函数调用不同 // lock.tryLock(1000,TimeUnit.MILLISECONDS); } catch (InterruptedException e) { System.out.println("收到了中断 推出"); return; } // 只有加锁之后才能放锁 不然会异常 lock.unlock(); System.out.println("A end"); } }
lock锁的中断响应和超时响应实现
最新推荐文章于 2023-08-20 14:56:39 发布