生产者消费者模式描述的是协调与协作关系。比如一个人正在准备食物(生产者),而另一个人正在吃(消费者),他们使用一个共用 的桌子用于放置盘子和取走盘子,生产者准备食物,如果桌子上已经满了就等待,消费者(那个吃的)如果桌子空了的话就等待
采用生产者消费者模式可以做到异步,解耦的目的。
public class Produce implements Runnable { public Object lock; public LinkedList<String> list; private volatile boolean isRunning = true; private static AtomicInteger count = new AtomicInteger(); public Produce(Object object, LinkedList<String> list) { this.lock = object; this.list = list; } @Override public void run() { try { while (isRunning) { Thread.sleep(1000); synchronized (lock) { while (list.size() >= 5) { System.out.println(Thread.currentThread().getName() + " 正在等待 "); lock.wait(); } String value = "data:"+count.getAndIncrement(); list.offerLast(value); System.out.println(Thread.currentThread().getName() + " 生产数据 "+ value); lock.notifyAll(); } } } catch (InterruptedException e) { e.printStackTrace(); } } public void stop() { isRunning = false; } }
public class Consumer implements Runnable { private volatile boolean isRunning = true; public Object lock; public LinkedList<String> list;// 用list存放生产之后的数据,最大容量为1 public Consumer(Object object, LinkedList<String> list ) { this.lock = object; this.list = list; } @Override public void run() { try { while (isRunning) { synchronized (lock) { while (list.isEmpty()) { System.out.println(Thread.currentThread().getName() + " 正在等待"); lock.wait(); } String value = list.pollFirst(); System.out.println(Thread.currentThread().getName() + " 消费数据 >>"+ value); lock.notifyAll();// } Thread.sleep(2000); } } catch (Exception e) { // TODO: handle exception } } public void stop() { isRunning = false; } }
public class Client { public static void main(String[] args) { Object lock = new Object(); LinkedList<String> list = new LinkedList<String>(); IntStream.range(1, 4).forEach(i -> new Thread(new Produce(lock, list), "【生产者" + i + "】").start()); IntStream.range(1, 3).forEach(i -> new Thread(new Consumer(lock, list), "【消费者" + i + "】").start()); } }