多线程的多消费者和多生产者signal和await

package test;

import java.awt.List;
import java.awt.image.AreaAveragingScaleFilter;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import java.io.BufferedInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import javax.security.auth.callback.LanguageCallback;
import javax.swing.text.StyledEditorKit.BoldAction;

class Resourse {
	private String name;
	private boolean flag = false;
	private int count;
	Lock lock = new ReentrantLock();
	Condition proCondition = lock.newCondition();
	Condition condition = lock.newCondition();

	public void put(String name) {
		lock.lock();
		try {
			while (flag) {
				try {
					proCondition.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}

			flag = true;
			++count;
			this.name = name + count;
			condition.signal();
		} finally {
			lock.unlock();
		}
	}

	public void take() {
		lock.lock();
		try {
			while (!flag) {
				try {
					condition.await();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			flag = false;
			System.out.println(Thread.currentThread().getName() + " ........" + this.name);
			proCondition.signal();
		} finally {
			lock.unlock();
		}
	}
}

class Producer implements Runnable {
	Resourse r;

	Producer(Resourse r) {
		this.r = r;
	}

	@Override
	public void run() {
		while (true) {
			r.put("烤鸭");
		}
	}

}

class Consumer implements Runnable {
	Resourse r;

	Consumer(Resourse r) {
		this.r = r;
	}

	@Override
	public void run() {
		while (true)
			r.take();
	}

}

public class Main {

	public static void main(String[] args) throws Exception {

		Scanner scanner = new Scanner(new BufferedInputStream(System.in));
		PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
		
		Resourse r = new Resourse();
		Producer a = new Producer(r);
		Producer b = new Producer(r);
		Consumer c = new Consumer(r);
		Consumer d = new Consumer(r);
		
		Thread t1 = new Thread(a);
		Thread t2 = new Thread(b);
		Thread t3 = new Thread(c);
		Thread t4 = new Thread(d);
		
		t1.start();
		t2.start();
		t3.start();
		t4.start();
	}
}

  

猜你喜欢

转载自www.cnblogs.com/WINDZLY/p/11788632.html
今日推荐