1、使用synchronized
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* synchronized实现的生产者和消费者
*/
public class ProducerCustomerWithSynchronized {
Executor pool = Executors.newFixedThreadPool(10);
//仓库
private List<String> storageList = new LinkedList<String>();
//仓库容量
private int MAX_SIZE = 3;
//仓库为空
private int ZERO = 0;
//生产者线程
private class Producer implements Runnable{
//生产方法,需同步
private void produce(){
synchronized (storageList) {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备生产!");
try {
if(storageList.size()==MAX_SIZE) {
System.out.println("仓库已满!等待消费者消费");
Thread.sleep(1000);
storageList.wait();//当前线程放弃锁,处于等待状态,让其他线程执行
}
if(storageList.size()<MAX_SIZE) {
String name = "产品"+new Random().nextInt();
storageList.add(name);
System.out.println(Thread.currentThread().getName()+"往仓库中生产了一个产品!");
}
Thread.sleep(1000);
storageList.notifyAll();//当前线程放弃锁,唤醒其他线程
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}
}
}
@Override
public void run() {
while(true) {
produce();
}
}
}
//消费者线程
private class Customer implements Runnable{
//消费方法,需同步
private void consume() {
synchronized (storageList) {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备消费!");
try {
if(storageList.size()==ZERO) {
System.out.println("仓库已空!等待生产者生产");
Thread.sleep(1000);
storageList.wait();//当前线程放弃锁,处于等待状态,让其他线程执行
}
if(storageList.size()!=ZERO) {
System.out.println(Thread.currentThread().getName()+"从仓库取得产品:"+storageList.remove(0));
}
Thread.sleep(1000);
storageList.notifyAll();//当前线程放弃锁,唤醒其他线程
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}
}
}
@Override
public void run() {
while(true) {
consume();
}
}
}
//启动生产者和消费者线程
public void start() {
for(int i=1;i<5;i++) {
//new Thread(new Producer()).start();
//new Thread(new Customer()).start();
pool.execute(new Producer());
pool.execute(new Customer());
}
}
public static void main(String[] args) {
ProducerCustomerWithSynchronized pc = new ProducerCustomerWithSynchronized();
pc.start();
}
}
2.使用Lock
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* Lock实现的生产者和消费者
*
*/
public class ProducerCustomerWithLock {
Executor pool = Executors.newFixedThreadPool(10);
//仓库
private List<String> storageList = new LinkedList<String>();
//仓库容量
private int MAX_SIZE = 3;
//仓库为空
private int ZERO = 0;
//获取锁对象
private Lock lock = new ReentrantLock();
//仓库满了,绑定生产者线程
private Condition full = lock.newCondition();
//仓库为空,绑定消费者线程
private Condition empty = lock.newCondition();
//生产者线程
private class Producer implements Runnable{
//生产方法,需同步
private void produce(){
if(lock.tryLock()) {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备生产!");
try {
if(storageList.size()==MAX_SIZE) {
System.out.println("仓库已满!等待消费者消费");
Thread.sleep(1000);
full.await();//生产者线程加入线程等待池
}
if(storageList.size()<MAX_SIZE){
String name = "产品"+new Random().nextInt();
storageList.add(name);
System.out.println(Thread.currentThread().getName()+"往仓库中生产了一个产品!");
}
Thread.sleep(1000);
empty.signalAll();//唤醒消费者线程
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}finally{
lock.unlock();
}
}
}
@Override
public void run() {
while(true) {
produce();
}
}
}
//消费者线程
private class Customer implements Runnable{
//消费方法,需同步
private void consume() {
if(lock.tryLock()) {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备消费!");
try {
if(storageList.size()==ZERO) {
System.out.println("仓库已空!等待生产者生产");
Thread.sleep(1000);
empty.await();//消费者线程加入线程等待池
}
if(storageList.size()!=ZERO) {
System.out.println(Thread.currentThread().getName()+"从仓库取得产品:"+storageList.remove(0));
}
Thread.sleep(1000);
full.signalAll();//唤醒生产者线程
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}finally{
lock.unlock();
}
}
}
@Override
public void run() {
while(true) {
consume();
}
}
}
//启动生产者和消费者线程
public void start() {
for(int i=1;i<5;i++) {
//new Thread(new Producer()).start();
//new Thread(new Customer()).start();
pool.execute(new Producer());
pool.execute(new Customer());
}
}
public static void main(String[] args) {
ProducerCustomerWithLock pc = new ProducerCustomerWithLock();
pc.start();
}
}
3.BlockingQueue实现的生产者和消费者
import java.util.Random;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingQueue;
/**
* BlockingQueue实现的生产者和消费者
*
*/
public class ProducerCustomerWithBlockingQueue {
Executor pool = Executors.newFixedThreadPool(10);
//仓库
private BlockingQueue<String> storageQueue = new LinkedBlockingQueue<String>(5);
//仓库容量
private int MAX_SIZE = 3;
//仓库为空
private int ZERO = 0;
//生产者线程
private class Producer implements Runnable{
//生产方法,需同步
private void produce(){
try {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备生产!");
if(storageQueue.size()==MAX_SIZE) {
System.out.println("仓库已满!等待消费者消费");
Thread.sleep(1000);
}
if(storageQueue.size()<=MAX_SIZE) {
String product = "产品"+new Random().nextInt();
storageQueue.put(product);
System.out.println(Thread.currentThread().getName()+"往仓库中生产了一个产品!");
}
Thread.sleep(1000);
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}
}
@Override
public void run() {
while(true) {
produce();
}
}
}
//消费者线程
private class Customer implements Runnable{
//消费方法,需同步
private void consume() {
try {
System.out.println(Thread.currentThread().getName()+"进入仓库,准备消费!");
if(storageQueue.size()==ZERO) {
System.out.println("仓库已空!等待生产者生产");
Thread.sleep(1000);
}
if(storageQueue.size()!=ZERO) {
System.out.println(Thread.currentThread().getName()+"从仓库取得产品:"+storageQueue.take());
}
Thread.sleep(1000);
}catch(InterruptedException ie) {
System.out.println("中断异常");
ie.printStackTrace();
}
}
@Override
public void run() {
while(true) {
consume();
}
}
}
//启动生产者和消费者线程
public void start() {
for(int i=1;i<5;i++) {
//new Thread(new Producer()).start();
///new Thread(new Customer()).start();
pool.execute(new Producer());
pool.execute(new Customer());
}
}
public static void main(String[] args) {
ProducerCustomerWithBlockingQueue pc = new ProducerCustomerWithBlockingQueue();
pc.start();
}
}