lock 中断阻塞的线程 ,通过 lockInterruptibly() 实现
时间: 2024-03-15 16:46:35 浏览: 13
除了使用 `lock()` 方法来获取锁外,Java 中的 `Lock` 接口还提供了一种可以中断阻塞的获取锁方式,即 `lockInterruptibly()` 方法。
如果一个线程在等待锁的过程中被中断,那么 `lock()` 方法会一直阻塞,直到获取到锁或者线程被中断。而 `lockInterruptibly()` 方法不同,它会在等待锁的过程中响应中断,即如果一个线程在等待锁的过程中被中断,那么该方法会抛出 `InterruptedException` 异常,从而中断线程的等待过程。
以下是一个使用 `lockInterruptibly()` 方法来中断阻塞的线程的示例代码:
```java
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class LockInterruptExample {
// 创建一个 Lock 对象
private Lock lock = new ReentrantLock();
// 定义一个线程函数
private void worker() {
try {
// 尝试获取锁,如果线程被中断则抛出异常
lock.lockInterruptibly();
System.out.println("线程开始执行");
// 执行一些耗时的操作
for (int i = 0; i < 10000000; i++) {
// do something
}
System.out.println("线程执行完毕");
} catch (InterruptedException e) {
System.out.println("线程被中断");
} finally {
// 释放锁
lock.unlock();
}
}
public static void main(String[] args) throws InterruptedException {
LockInterruptExample example = new LockInterruptExample();
// 创建一个线程并启动
Thread t = new Thread(() -> {
example.worker();
});
t.start();
// 等待一段时间后中断线程
Thread.sleep(1000);
t.interrupt();
}
}
```
在这个示例代码中,我们使用 `lockInterruptibly()` 方法来获取锁,并在 `try-catch-finally` 语句块中处理可能抛出的异常。如果线程被中断,则会在 `catch` 语句块中处理中断逻辑。在 `finally` 语句块中释放锁。
在 `main()` 方法中,我们创建了一个线程并启动后等待一段时间后中断线程,从而触发 `lockInterruptibly()` 方法抛出异常。