Condition实现精确通知唤醒

该博客探讨了如何在Java并发编程中利用`java.util.concurrent.locks.Condition`来实现精确的通知与唤醒机制。通过`ReentrantLock`和多个`Condition`对象,实现了数字资源类`DataJUC2`中A、B、C三个线程按顺序打印的示例,展示了条件变量在多线程同步中的应用。
摘要由CSDN通过智能技术生成

Condition实现精确通知唤醒

package JUC;

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

/**   
 * Copyright © 2021 eSunny Info. Tech Ltd. All rights reserved.
 * 
 * 功能描述:
 * @Package: JUC 
 * @author: 79283   
 * @date: 2021年1月20日 下午7:13:51 
 */
public class ProviderConsumerJUC2 {
	
	public static void main(String[] args) {
		DataJUC2 data = new DataJUC2();
		new Thread(()->{
			for (int i = 0; i < 10; i++) {
				data.printA();
			}
		},"A") .start();
		
		new Thread(()->{
			for (int i = 0; i < 10; i++) {
				data.printB();
			}
		},"B") .start();
		
		new Thread(()->{
			for (int i = 0; i < 10; i++) {
				data.printC();
			}
		},"C") .start();
		
	}
}

class DataJUC2{//数字 资源类
	
	private int number = 1; //1A 2B 3C
	
	private Lock lock = new ReentrantLock();
	//Condition 等待唤醒
	Condition newCondition = lock.newCondition();
	Condition newCondition2 = lock.newCondition();
	Condition newCondition3 = lock.newCondition();
	
	// A
	public void printA() {
		lock.lock();
		try {
			while (number!=1) {
				
				newCondition.await();
			}
			System.out.println(Thread.currentThread().getName() + "=> A");
			number = 2;
			newCondition2.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void printB() {
		lock.lock();
		try {
			while (number!=2) {
				newCondition2.await();
			}
			System.out.println(Thread.currentThread().getName() + "=> B");
			number = 3;
			newCondition3.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
	
	public void printC() {
		lock.lock();
		try {
			while (number!=3) {
				newCondition3.await();
			}
			System.out.println(Thread.currentThread().getName() + "=> C");
			number = 1;
			newCondition.signal();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}

	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值