Java生产者消费者的lock版本实现

lock版实现,使用了condition做线程之间的同步。

代码如下:

import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
 * @author herman
 */
public class ProducerAndConsumer {
	private final int max = 5;
	private Queue<Integer> queue = new LinkedList<Integer>();
	private final Lock lock = new ReentrantLock();
	private final Condition condition = lock.newCondition();

	class Producer extends Thread {
		@Override
		public void run() {
			producer();
		}

		private void producer() {
			while (true) {
				lock.lock();
				try {
					while (queue.size() == max) {
						System.out.println("满了");
						try {
							condition.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					queue.add(1);
					condition.signal();
					System.out.println("+1, size是:" + queue.size());
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} finally {
					lock.unlock();
				}
			}
		}
	}

	class Consumer extends Thread {
		@Override
		public void run() {
			consumer();
		}

		private void consumer() {
			while (true) {
				lock.lock();
				try {
					while (queue.size() == 0) {
						System.out.println("空了");
						try {
							condition.await();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
					queue.poll();
					condition.signal();
					System.out.println("-1, size是:" + queue.size());
					try {
						Thread.sleep(500);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				} finally {
					lock.unlock();
				}
			}
		}
	}

	public static void main(String[] args) {
		ProducerAndConsumer pc = new ProducerAndConsumer();
		Producer producer = pc.new Producer();
		Consumer consumer = pc.new Consumer();
		producer.start();
		consumer.start();
	}
}

猜你喜欢

转载自blog.csdn.net/cyberHerman/article/details/88662704
今日推荐