并发编程基础之生产者消费者模式
Posted 格物致知
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发编程基础之生产者消费者模式相关的知识,希望对你有一定的参考价值。
一:概念
生产者消费者模式是java并发编程中很经典的并发情况,首先有一个大的容器,生产者put元素到
容器中,消费者take元素出来,如果元素的数量超过容器的容量时,生产者不能再往容器中put元素
,处于阻塞状态,如果元素的数量等于0,则消费者不能在从容器中take数据,处于阻塞状态。
二:示例
/** * */ package com.hlcui.main; import java.util.LinkedList; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * @author Administrator * */ public class MyQueue { private LinkedList<String> list = new LinkedList<String>(); private AtomicInteger auto = new AtomicInteger(); private int MAX_SIZE; private final int MIN_SIZE = 0; private final Object lock = new Object(); public MyQueue(int mAX_SIZE) { super(); MAX_SIZE = mAX_SIZE; } public void put(String good) { synchronized (lock) { while(list.size()==MAX_SIZE) { try { //如果容器中物品的数量达到上限,那么就阻塞线程 System.out.println("容器已满"); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } list.add(good); auto.incrementAndGet(); lock.notify(); } } public String take() { String s = null; synchronized (lock) { while(list.size()==MIN_SIZE) { try { System.out.println("容器已空"); lock.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } s = list.removeFirst(); auto.decrementAndGet(); lock.notify(); } return s; } public int size() { return list.size(); } public static void main(String[] args) { final MyQueue queue = new MyQueue(5); for(int i=0;i<5;i++) { queue.put(i+""); } System.out.println("目前容器中元素数量:"+queue.size()); ExecutorService executors = Executors.newFixedThreadPool(2); executors.execute(new Runnable() { @Override public void run() { for(int i=10;i<20;i++) { queue.put(i+""); System.out.println("添加元素:"+i+""); } } }); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } executors.execute(new Runnable() { @Override public void run() { for(int i=0;i<50;i++) { System.out.println("取出元素:"+queue.take()); } } }); } }
以上是关于并发编程基础之生产者消费者模式的主要内容,如果未能解决你的问题,请参考以下文章
Java并发编程实战之基于生产者消费者模式的日志服务读书笔记