面试题答案
一键面试实现思路
- 使用
Condition
接口:Condition
是在java.util.concurrent.locks
包中,它提供了比传统Object
的wait
和notify
方法更灵活的线程间通信机制。 - 创建
Lock
和Condition
实例:通过Lock
创建对应的Condition
,线程在需要进入TIMED_WAITING
状态时,调用Condition
的await
方法并设置等待时间。 - 唤醒特定线程:当需要将处于
TIMED_WAITING
状态的线程唤醒时,通过Condition
的signal
或signalAll
方法,同时利用Lock
保证操作的原子性,避免竞态条件。
关键代码片段
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadStateTransition {
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
public void timedWait() {
lock.lock();
try {
condition.await(5, java.util.concurrent.TimeUnit.SECONDS);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
lock.unlock();
}
}
public void signal() {
lock.lock();
try {
condition.signal();
} finally {
lock.unlock();
}
}
}
在上述代码中:
timedWait
方法中,线程获取lock
后调用condition.await(5, TimeUnit.SECONDS)
进入TIMED_WAITING
状态,等待5秒或被其他线程唤醒。signal
方法获取lock
后调用condition.signal
唤醒一个等待在condition
上的线程,确保操作的原子性,避免竞态条件。