Java 使用Condition实现 生产者/消费者模式

一对一交替打印:

package org.test.t8.t_3;

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


public class MyService {

	private ReentrantLock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean hasValue = false;
	public void set() {
		try {
			lock.lock();
			while(hasValue == true){
				condition.await();
			}
			System.out.println("打印★");
		    hasValue = true;
		    condition.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
		public void get() {
			try {
				lock.lock();
				while(hasValue == false){
					condition.await();
				}
				System.out.println("打印☆");
			    hasValue = false;
			    condition.signal();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}	
	  }
	public static void main(String[] args) {
		MyService service = new MyService();
		ThreadA a = new ThreadA(service);
		a.start();
		ThreadB b = new ThreadB(service);
		b.start();
	}
}

Java 使用Condition实现 生产者/消费者模式
Java 使用Condition实现 生产者/消费者模式
Java 使用Condition实现 生产者/消费者模式

多对多交替打印
更改MyService类:

public class MyService {

	private ReentrantLock lock = new ReentrantLock();
	private Condition condition = lock.newCondition();
	private boolean hasValue = false;
	public void set() {
		try {
			lock.lock();
			while(hasValue == true){
				System.out.println("有可能★★连续");
				condition.await();
			}
			System.out.println("打印★");
		    hasValue = true;
		    condition.signal();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.unlock();
		}
	}
		public void get() {
			try {
				lock.lock();
				while(hasValue == false){
					System.out.println("有可能☆☆连续");
					condition.await();
				}
				System.out.println("打印☆");
			    hasValue = false;
			    condition.signal();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}finally{
				lock.unlock();
			}	
	  }
	public static void main(String[] args) {
		MyService service = new MyService();
		ThreadA[] a = new ThreadA[10];
		ThreadB[] b = new ThreadB[10];
		for (int i = 0; i < 10; i++) {
			a[i] = new ThreadA(service);
			b[i] = new ThreadB(service);
			a[i].start();
			b[i].start();
		}
	}
}

Java 使用Condition实现 生产者/消费者模式
此时程序出现假死;
此时可以将使用notifyAll()或者signalAll()方法来解决,将MyService类中的signal()改为signalAll()即可。

出现了“有可能☆☆连续”和”有可能★★连续’不是交替输出的情况,原因是程序中使用了Condition对象,再结合signalAll()方法来唤醒所有的线程,那么唤醒的线程就有可能是同类,所以就出现连续打印出“有可能☆☆连续”和”有可能★★连续’的情况。