Java多线程之~~~~使用wait和notify实现生产者消费者模型

在多线程开发中,最经典的一个模型就是生产者消费者模型,他们有一个缓冲区,缓冲区有最大限制,当缓冲区满

的时候,生产者是不能将产品放入到缓冲区里面的,当然,当缓冲区是空的时候,消费者也不能从中拿出来产品,这就

涉及到了在多线程中的条件判断,java为了实现这些功能,提供了wait和notify方法,他们可以在线程不满足要求的时候

让线程让出来资源等待,当有资源的时候再notify他们让他们继续工作,下面我们用实际的代码来展示如何使用wait和

notify来实现生产者消费者这个经典的模型。


首先是缓冲区的实现,我们使用LinkedList来代替


package com.bird.concursey.charpet2;

import java.util.Date;
import java.util.LinkedList;
import java.util.List;

public class EventStorage {
	
	private int maxSize;
	
	private List<Date> storage;
	
	public EventStorage() {
		maxSize = 10;
		storage = new LinkedList<Date>();
	}
	
	public synchronized void set() {
		while(storage.size() == maxSize) {
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		storage.add(new Date());
		System.out.printf("Set: %d",storage.size());
		notifyAll();
	}
	
	public synchronized void get() {
		while(storage.size() == 0) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		System.out.printf("Get: %d: %s",storage.size(),((LinkedList<?>)storage).poll());
		notifyAll();
	}
}


然后就是生产者和消费者


package com.bird.concursey.charpet2;

public class Producer implements Runnable {
	
	private EventStorage storge;
	
	public Producer(EventStorage storage) {
		this.storge = storage;
	}

	@Override
	public void run() {
		for(int i = 0; i < 100; i++) {
			storge.set();
		}
	}

}



package com.bird.concursey.charpet2;

public class Consumer implements Runnable {
	
	private EventStorage storage;
	
	public Consumer(EventStorage storage) {
		this.storage = storage;
	}

	@Override
	public void run() {
		for(int i = 0; i < 100; i++) {
			storage.get();
		}
	}
	
	public static void main(String[] args) {
		EventStorage storage = new EventStorage();
		Producer producer = new Producer(storage);
		Thread thread1 = new Thread(producer);
		
		Consumer consumer = new Consumer(storage);
		Thread thread2 = new Thread(consumer);
		
		thread2.start();
		thread1.start();
	}
}

可以看到,这里面就是用了wait和notifyall方法实现了生产者消费方法,具体的运行过程大家可以通过阅读代码来体

会,还是很直观的。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。