前言:生产者消费者模式是工作中多线程开发很常用的一种模式,也是笔试面试高频考点
1.使用阻塞队列实现
(阻塞队列有很多,如ArrayBlockingQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue)
/** * 使用阻塞队列实现 * * @author m969130721@163.com * @date 18-10-14 上午11:10 */ public class BlockingQueueDemo { public static void main(String[] args) { BlockingQueue blockingQueue = new LinkedBlockingQueue(1); ProductFactory productFactory = new ProductFactory(blockingQueue); Customer customer = new Customer(blockingQueue); Thread productFactoryThread = new Thread(productFactory); Thread customerThread1 = new Thread(customer); Thread customerThread2 = new Thread(customer); productFactoryThread.start(); customerThread1.start(); customerThread2.start(); } } /** * 生产者 */ class ProductFactory implements Runnable { private BlockingQueue<Product> blockingQueue; ProductFactory(BlockingQueue<Product> blockingQueue) { this.blockingQueue = blockingQueue; } @Override public void run() { while (true) { Product product = new Product("产品"); try { // System.out.println(Thread.currentThread().getName() + " 生产者生产准备开始............."); blockingQueue.put(product); System.out.println(Thread.currentThread().getName() + " 添加一个产品:" + product); } catch (InterruptedException e) { e.printStackTrace(); } } } } /** * 消费者 */ class Customer implements Runnable { private BlockingQueue<Product> blockingQueue; Customer(BlockingQueue<Product> blockingQueue) { this.blockingQueue = blockingQueue; } @Override public void run() { try { // System.out.println(Thread.currentThread().getName() + " 消费者消费准备开始.............."); Product product = blockingQueue.take(); System.out.println(Thread.currentThread().getName() + " 取出一个产品:"+product); } catch (InterruptedException e) { e.printStackTrace(); } } } class Product { private String name; Product(String name) { this.name = name; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Product{" + "name='" + name + '\'' + '}'; } }
2.使用显示锁Lock实现:
/** * 两个Condition实现 * * @author m969130721@163.com * @date 18-10-14 下午3:11 */ public class LockDemo { public static void main(String[] args) { Gift gift = new Gift("礼物", 998, false); ReentrantLock reentrantLock = new ReentrantLock(); //读写分离锁,生产一个,消费者一个 Condition productCondition = reentrantLock.newCondition(); Condition customerCondition = reentrantLock.newCondition(); GiftFactory factory = new GiftFactory(gift, reentrantLock, productCondition, customerCondition); SendGift sendGift = new SendGift(gift, reentrantLock, productCondition, customerCondition); Thread giftFactory = new Thread(factory); Thread sendGift1 = new Thread(sendGift); Thread sendGift2 = new Thread(sendGift); giftFactory.start(); sendGift1.start(); sendGift2.start(); } } class Gift { private String name; private float price; private boolean flag; Gift(String name, float price, boolean flag) { this.name = name; this.price = price; this.flag = flag; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public String toString() { return "Gift{" + "name='" + name + '\'' + ", price=" + price + ", flag=" + flag + '}'; } } /** * 消费者 */ class GiftFactory implements Runnable { private Gift gift; private ReentrantLock reentrantLock; private Condition productCondition; private Condition customerCondition; GiftFactory(Gift gift, ReentrantLock reentrantLock, Condition productCondition, Condition customerCondition) { this.gift = gift; this.reentrantLock = reentrantLock; this.productCondition = productCondition; this.customerCondition = customerCondition; } @Override public void run() { while (true) { try { reentrantLock.lock(); //有礼物 if (gift.isFlag()) { productCondition.await(); } System.out.println("生产gift:" + gift.getName() + ",price:" + gift.getPrice()); gift.setFlag(true); customerCondition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } } } class SendGift implements Runnable { private Gift gift; private ReentrantLock reentrantLock; private Condition productCondition; private Condition customerCondition; SendGift(Gift gift, ReentrantLock reentrantLock, Condition productCondition, Condition customerCondition) { this.reentrantLock = reentrantLock; this.gift = gift; this.productCondition = productCondition; this.customerCondition = customerCondition; } @Override public void run() { try { reentrantLock.lock(); //没有礼物 if (!gift.isFlag()) { customerCondition.await(); } System.out.println("发送gift:" + gift.getName() + ",price:" + gift.getPrice()); gift.setFlag(false); productCondition.signal(); } catch (Exception e) { e.printStackTrace(); } finally { reentrantLock.unlock(); } } }
3.隐式锁实现:
/** * @author m969130721@163.com * @date 18-10-14 下午1:59 */ public class SynchronizedDemo { public static void main(String[] args) { Food food = new Food("offer",12*14,false); FoodFactory foodFactory = new FoodFactory(food); EatFood eatFood = new EatFood(food); Thread createThread = new Thread(foodFactory); Thread eatThread1 = new Thread(eatFood); Thread eatThread2 = new Thread(eatFood); createThread.start(); eatThread1.start(); eatThread2.start(); } } class Food { private String name; private float price; private boolean flag; Food(String name,float price,boolean flag){ this.name = name; this.price = price; this.flag = flag; } public String getName() { return name; } public void setName(String name) { this.name = name; } public float getPrice() { return price; } public void setPrice(float price) { this.price = price; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; } @Override public String toString() { return "Food{" + "name='" + name + '\'' + ", price=" + price + ", flag=" + flag + '}'; } } /** * 生产者 */ class FoodFactory implements Runnable { private Food food; FoodFactory(Food food) { this.food = food; } @Override public void run() { while (true) { synchronized (food) { //存在 if (food.isFlag()) { try { food.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } food.setFlag(true); System.out.println("生产商品:" + food.getName() + ",价格:" + food.getPrice()); food.notify(); } } } } /** * 消费者 */ class EatFood implements Runnable { private Food food; EatFood(Food food) { this.food = food; } @Override public void run() { synchronized (food) { //不存在 if (!food.isFlag()) { try { food.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } food.setFlag(false); System.out.println("消费商品:" + food.getName() + ",价格:" + food.getPrice()); food.notify(); } } }