java实现生产者消费者的实例代码

这篇文章主要介绍“java实现生产者消费者的实例代码”,在日常操作中,相信很多人在java实现生产者消费者的实例代码问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”java实现生产者消费者的实例代码”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

目前成都创新互联公司已为近千家的企业提供了网站建设、域名、雅安服务器托管、网站托管、服务器托管、企业网站设计、通山网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

if只会判断一次,而while一直会判断

永远要使用notifyAll不要使用notify。

public class MyContainer1 {
	final private LinkedList lists = new LinkedList<>();
	final private int MAX = 10; //最多10个元素
	private int count = 0;	//当前有多少个
	
	
	public synchronized void put(T t) {
		while(lists.size() == MAX) { //想想为什么用while而不是用if?
			try {
				this.wait(); //effective java
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		
		lists.add(t);
		++count;
		this.notifyAll(); //通知消费者线程进行消费
	}
	
	public synchronized T get() {
		T t = null;
		while(lists.size() == 0) {
			try {
				this.wait();	//effective java
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		t = lists.removeFirst();
		count --;
		this.notifyAll(); //通知生产者进行生产
		return t;
	}
	
	public static void main(String[] args) {
		MyContainer1 c = new MyContainer1<>();
		//启动消费者线程
		for(int i=0; i<10; i++) {
			new Thread(()->{
				for(int j=0; j<5; j++) System.out.println(c.get());
			}, "c" + i).start();
		}
		
		try {
			TimeUnit.SECONDS.sleep(2);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		//启动生产者线程
		for(int i=0; i<2; i++) {
			new Thread(()->{
				for(int j=0; j<25; j++) c.put(Thread.currentThread().getName() + " " + j);
			}, "p" + i).start();
		}
	}
}

到此,关于“java实现生产者消费者的实例代码”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!


本文名称:java实现生产者消费者的实例代码
浏览地址:http://scyanting.com/article/jioepi.html