多线程编程模式之Producer & Consumer(生产者和消费者模式)

    xiaoxiao2022-07-12  136

    Producer & Consumer

    文章目录

    Producer & ConsumerProducer & Consumer模式介绍Producer & Consumer的使用场景Producer & Consumer示例代码分析Producer & Consumer的理解

    Producer & Consumer模式介绍

    生产者是指生产数据的线程,消费者是指使用数据的线程;生产者-消费者模式是一种为实现生产者安全地将数据交给消费者这一目标而存在的模式;

    Producer & Consumer的使用场景

    生产数据和使用数据的线程并不相同,且互不干扰;

    Producer & Consumer示例代码分析

    //数据使用线程 public class Consumer extends Thread { private final Random random; private final Table table; public Consumer(String name,Table table, long seed){ super(name); this.table=table; random=new Random(seed); } public void run(){ try{ while(true){ table.take(); Thread.sleep(random.nextInt(1000)); } }catch (InterruptedException e){ e.printStackTrace(); } } } //数据生产线程 public class Producer extends Thread { private final Random random; private final Table table; private static int id=0; public Producer(String name,Table table,long seed){ super(name); this.random=new Random(seed); this.table=table; } public void run(){ try{ while(true){ Thread.sleep(random.nextInt(1000)); String cake="[Cake NO."+nextId()+" by "+getName()+"]"; table.put(cake); } }catch(InterruptedException e){ e.printStackTrace(); } } private static synchronized int nextId(){ return id++; } } //协调者 public class Table{ private final String[] buffer; private int tail; private int head; private int count; public Table(int count){ this.buffer=new String[count]; this.head=0; this.tail=0; this.count=0; } public synchronized void put(String cake) throws InterruptedException{ System.out.println(Thread.currentThread().getName()+" puts "+cake); while(count>=buffer.length){ wait(); } buffer[tail]=cake; tail=(tail+1)%buffer.length; count++; notifyAll(); } public synchronized void take() throws InterruptedException{ while(count<=0){ wait(); } String cake=buffer[head]; head=(head+1)%buffer.length; count--; notifyAll(); System.out.println(Thread.currentThread().getName()+" takes "+cake); } } //启动类 public class Tester { public static void main(String[] args){ Table table=new Table(3); new Producer("Producer-1",table,31415).start(); new Producer("Producer-2",table,33333).start(); new Producer("Producer-3",table,12345).start(); new Consumer("Consumer-1",table,31415).start(); new Consumer("Consumer-2",table,33333).start(); new Consumer("Consumer-3",table,12345).start(); } }

    Producer & Consumer的理解

    因为Consumer和Producer分别属于两个不同的线程,它们之间通过数据联系;而数据的管理者——Table起到了协调这两种线程的作用:put和take方法分别使用Guarded Suspension模式来协调二者;也就是说,在该模式中,承担守护者责任的是Table类,它维持着线程的协调运行和互斥处理;

    生产者和消费者模式是一种常见的多线程协作模式;

    最新回复(0)