Condition实现精确通知唤醒

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();
		}
	}

	
}

猜你喜欢

转载自blog.csdn.net/jj89929665/article/details/112937340