1. LockSupport工具
1.1 LockSupport的作用
当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应工作。LockSupport定义了一组公共的静态方法,这些方法提供了做基本的线程阻塞和唤醒功能。
1.2 LockSupport提供的阻塞和唤醒方法
方法 | 描述 |
---|---|
void park() | 阻塞当前线程,如果调用unpark(Thread)方法或被中断,才能从park()返回。 |
void parkNanos(long nanos) | 阻塞当前线程的超时返回版本,阻塞时间最长不超过nanos纳秒。 |
void parkUntil(long deadline) | 阻塞当前线程,直到deadline时间(从1970年开始到deadline时间的毫秒数)。 |
void unpark(Thread) | 唤醒处于阻塞状态的线程. |
1.3 LockSupport新增的方法
在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker, long nanos)、parkUntil(Object blocker, long deadline)这3个方法,用于实现阻塞当前线程的功能,其中参数blocker是用来标识当前线程在等待的对象,该对象主要用于问题排查和系统监控。
2. Condition接口
2.1 Condition接口的理解
Java对象的wait()、notify()等方法和synchronized关键字配合,可以实现等待/通知模式。此外还有一种方式可以实现等待/通知模式:Condition接口与Lock接口配合。
2.2 Condition接口示例
public class ConditionUseCase { Lock lock = new ReentrantLock(); Condition condition = lock.newCondition(); public void conditionWait() throws InterruptedException { lock.lock(); try { condition.await(); } finally { lock.unlock(); } } public void conditionSingnal() throws InterruptedException { lock.lock(); try { condition.signal(); } finally { lock.unlock(); } }}复制代码
- 1.Condition定义了等待/通知模式的相关方法,并且Condition实例是由锁创建出来的,在调用Condition的这些方法前需先获得和Condition对象相关联的锁。
- 2.调用await()方法后,当前线程释放锁并进入等待状态,当其他对象调用Condition的signal()方法后当前线程才能从await()方法中返回,且返回前已经获得了锁。
2.3 Condition的方法
方法 | 描述 |
---|---|
void await() throws InterruptedException | 当前线程进入等待状态,直到被通知(signal)或者被中断。 |
void awaitUninterruptibly() | 当前线程进入等待状态直到被通知,对中断不做响应。 |
long awaitNanos(long nanosTimeout) throws InterruptedException | void await() throws InterruptedException方法的超时等待版本,返回值表示当前剩余的时间,如果在nanosTimeout之前被唤醒,返回值 = nanosTimeout - 实际消耗的时间,返回值 <= 0表示超时。 |
boolean awaitUntil(Date deadline) throws InterruptedException | 当前线程进入等待状态直到被通知、中断、到达某个时间点。在deadline时间点前线程能被通知或中断则返回true,否则返回false。 |
void signal() | 唤醒一个等待在Condition上的线程。 |
void signalAll() | 唤醒所有等待在Condition上的线程。 |