Condition实现等待、唤醒

本文深入解析了JDK1.5引入的Condition接口,阐述其与传统Object类wait和notify方法的区别,详细介绍了Condition的各种方法及其使用场景,通过示例代码展示了如何在实际编程中运用Condition进行线程间的协调。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Condition 接口是 JDK 1.5 开始提供的,用来实现线程间的等待与唤醒

 

Condition 的对象可以通过 Lock 对象的 newCondition() 方法创建

Condition 对象方法的调用必须在 Lock 对象的 lock() 和 unlock() 之间,否则会抛出异常 java.lang.IllegalMonitorStateException

Condition 的 await()、signal()、signalAll() 方法与 Object 的 wait()、notify()、notifyAll() 方法功能类似

 

 

Condition 接口的方法包括

 

//当前线程等待,直到收到唤醒的信号或者被中断
void await() throws InterruptedException;
//当前线程等待,直到收到唤醒的信号,不可被中断
void awaitUninterruptibly();
//当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的等待纳秒数超时
long awaitNanos(long nanosTimeout) throws InterruptedException;
//当前线程等待,直到收到唤醒的信号 或 被中断 或 指定的时间超时
boolean await(long time, TimeUnit unit) throws InterruptedException;
//当前线程等待,直到收到唤醒的信号 或 被中断 或 超过指定时间
boolean awaitUntil(Date deadline) throws InterruptedException;
//唤醒一个等待中的线程
void signal();
//唤醒所有等待中的线程
void signalAll();

 

使用示例:

package constxiong.interview;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 测试 Lock Condition 的使用
 * @author ConstXiong
 * @date 2019-12-09 11:46:17
 */
public class TestLockCondition {
	
	public static void main(String[] args) throws InterruptedException {
		Lock lock = new ReentrantLock();
		Condition condition = lock.newCondition();
		
		for (int i = 0; i < 5; i++) {
			new Thread(() -> {
				try {
					lock.lock();
					System.out.println(Thread.currentThread().getName() + " wait for the signal");
					condition.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					lock.unlock();
				}
				System.out.println(Thread.currentThread().getName() + " receive the signal, go on ");
			}).start();
		}
		
//		休眠5秒
		Thread.sleep(5000);
		
		new Thread(() -> {
			try {
//				lock.lock();
				System.out.println("signal all current lock's condition");
				condition.signalAll();
			} finally {
				lock.unlock();
			}
		}).start();
		
	}
	
	
}

 

Condition 的实现

 

  • Condition 接口的唯一实现类是同步器 AQS 的内部类 ConditionObject
  • 每个 Condition 对象都包含着一个 FIFO 队列,拥有首节点(firstWaiter)和尾节点(lastWaiter)
  • 队列中的每个节点都包含了一个在 Condition 对象上等待的线程引用
  • await() 方法相当于同步队列的首节点(已获取锁)移动到 Condition 的等待队列中
  • signal() 方法将会唤醒在等待队列中的节点,移到同步队列中

实现原理可参考:https://blog.youkuaiyun.com/qq_38293564/article/details/80554516

 


【Java面试题与答案】整理推荐

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值