生产者消费者模式sychronized实现 java

生产者消费者模式sychronized实现 java

相信大家都对消费者和生产者模式有一定了解,这个场景经常会用到多线程,而且因为涉及到共享资源的获取和修改,必然是需要线程同步的,那这边我就用synchronized来试下消费者和生产者,希望大家能看明白,程序中有注释,基本上能看懂的,主要是对共享对象buffer中的两个方法进行同步

代码:

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

//生产者消费者模式
public class Producer_Consumer {
	public static void main(String[] args) {
		Buffer buffer = new Buffer(10);
		Producer producer = new Producer(buffer);
		Consumer consumer = new Consumer(buffer);
		//创建线程执行生产和消费
		for(int i = 0; i < 3; i++) {
			new Thread(producer,"Producer-"+i).start();
		}
for(int i = 0; i < 3; i++) {
			new Thread(consumer,"Consumer-"+(i+3)).start();
		}
	} 
}

//模拟生产者消费者的对象
class Buffer {
	private int maxSize;
	private List<Date> storage;
	Buffer(int size) {
		maxSize = size;
		storage  = new LinkedList<>();
	}
	//生产方法
	public synchronized void put () {
		try {
			while (storage.size() == maxSize) {//如果队列满了
				System.out.println(Thread.currentThread().getName()+": wait \n");
				wait();//阻塞线程
			}
			storage.add(new Date());
			System.out.println(Thread.currentThread().getName()+": put:"+storage.size()+"\n");
			Thread.sleep(1000);
			notifyAll();//唤起线程
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	//消费方法
	public synchronized void take () {
		try {
			while (storage.size() == 0) {//如果队列空了
				System.out.println(Thread.currentThread().getName()+": wait \n");
				wait();//阻塞线程
			}
			Date d = ((LinkedList<Date>)storage).poll();
			System.out.println(Thread.currentThread().getName()+": take:"+storage.size()+"\n");
			Thread.sleep(1000);
			notifyAll();//唤起线程
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

//生产者
class Producer implements Runnable {
	private Buffer buffer;
	Producer(Buffer b) {
		buffer = b;
	}
	@Override
	public void run() {
		while(true) {
			buffer.put();
		}
	}
}

//消费者
class Consumer implements Runnable {
	private Buffer buffer;
	Consumer(Buffer b) {
		buffer = b;
	}
	@Override
	public void run () {
		while (true) {
			buffer.take();
		}
	}
}

输出结果:

Producer-0: put:1


Producer-0: put:2


Producer-0: put:3


Producer-0: put:4


Producer-0: put:5


Producer-0: put:6


Producer-0: put:7


Producer-0: put:8


Producer-0: put:9


Producer-0: put:10


Producer-0: wait 


Consumer-5: take:9


Consumer-5: take:8


Consumer-5: take:7


Consumer-5: take:6


Consumer-5: take:5


Consumer-5: take:4


Consumer-5: take:3


Consumer-5: take:2


Consumer-5: take:1


Consumer-5: take:0


Consumer-5: wait 


Consumer-4: wait 


Consumer-3: wait 


Producer-2: put:1


Producer-2: put:2


Producer-2: put:3


Producer-2: put:4


Producer-2: put:5


Producer-2: put:6


Producer-2: put:7


Producer-2: put:8


Producer-2: put:9


Producer-2: put:10


Producer-2: wait 


Producer-1: wait 


Consumer-3: take:9


Consumer-3: take:8


Consumer-3: take:7


Consumer-3: take:6


Consumer-3: take:5


Consumer-3: take:4


Consumer-3: take:3


Consumer-3: take:2


Consumer-3: take:1


Consumer-3: take:0


Consumer-3: wait 


Consumer-4: wait 


Consumer-5: wait 


Producer-0: put:1


Producer-0: put:2


Producer-0: put:3


Consumer-5: take:2


Consumer-5: take:1


Consumer-5: take:0


Consumer-5: wait 


Consumer-4: wait 


Consumer-3: wait 


Producer-1: put:1


Producer-1: put:2


Producer-1: put:3


Producer-1: put:4


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值