资讯专栏INFORMATION COLUMN

生产者模式-消费者模式

Karuru / 1385人阅读

摘要:生产着,消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。生产者消费者模式中的内存缓冲区主要功能是数据在多线程间的共享,此外,通过该缓冲区,可以缓解生产者和消费者间的性能差。

生产着,消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。
通常有两个角色:
若干个生产者线程,若个个消费者线程。生产者线程负责提交用户的请求,消费者线程负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。
生产者-消费者模式中的内存缓冲区主要功能是数据在多线程间的共享,此外,通过该缓冲区,可以缓解生产者和消费者间的性能差。

public class Main {

public static void main(String[] args) throws InterruptedException {
    BlockingQueue queue = new LinkedBlockingDeque<>();  //缓冲区域
    Producer producer1 = new Producer(queue);
    Producer producer2 = new Producer(queue);//生产者
    Producer producer3 = new Producer(queue);
    Consumer consumer1 = new Consumer(queue);
    Consumer consumer2 = new Consumer(queue);//消费者
    Consumer consumer3 = new Consumer(queue);
    ExecutorService executorService = Executors.newCachedThreadPool();
    executorService.execute(producer1);
    executorService.execute(producer2);
    executorService.execute(producer3);
    executorService.execute(consumer1);
    executorService.execute(consumer2);
    executorService.execute(consumer3);

    Thread.sleep(10*1000);
    producer1.stop();
    producer2.stop();
    producer3.stop();
    Thread.sleep(3000);
    executorService.shutdown();
}

}
public class Producer implements Runnable{

private volatile boolean isRunning = true;
private BlockingQueue queue;
private static AtomicInteger count = new AtomicInteger();
private static final int SLEEEPTIME =1000;

public Producer(BlockingQueue queue) {
    this.queue = queue;
}

@Override
public void run() {
    PCData data = null;
    Random random = new Random();
    System.out.println("start producer name"+Thread.currentThread().getName());
    try{
        while (isRunning){
            Thread.sleep(random.nextInt(SLEEEPTIME));
            data = new PCData(count.incrementAndGet());
            System.out.println(data+"is put into queue");
            if(!queue.offer(data,2,TimeUnit.SECONDS)){
                System.err.println("failed to put data"+data);
            }
        }
    }catch (Exception e){
        e.printStackTrace();
        Thread.currentThread().interrupt();
    }
}

public void stop(){
    isRunning=false;
}

}
public class Consumer implements Runnable {

private BlockingQueue queue;
private static final int SLEEPTIME = 1000;
public Consumer(BlockingQueue queue) {
    this.queue = queue;
}

@Override
public void run() {
    System.out.println("start Consumer id"+Thread.currentThread().getName());
    Random random = new Random();
    try{
        while(true){
            PCData pcData = queue.take();
            if(pcData!=null){
                int re = pcData.getData()*pcData.getData();
                System.out.println(MessageFormat.format("{0}*{1}={2}",pcData.getData(),pcData.getData(),re));
                Thread.sleep(random.nextInt(SLEEPTIME));
            }
        }
    }catch (Exception e){
        e.printStackTrace();
        Thread.currentThread().interrupt();
    }
}

}
public class PCData {

private final int intData;

public PCData(int intData) {
    this.intData = intData;
}
public PCData(String data) {
    this.intData = Integer.valueOf(data);
}
public int getData(){
    return intData;
}

@Override
public String toString() {
    return "PCData{" +
            "intData=" + intData +
            "}";
}

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74691.html

相关文章

  • ActiveMQ的消息模式——主题模式(Topic)

    摘要:主题模式又名发布订阅者模式。先启动两个消费者,然后启动生产者发布条消息,这时两个消费者都可以消费服务器中的每一条消息。这就是主题模式的特点每个订阅者都可以消费主题模式中的每一条消息。 主题模式 又名 发布订阅者模式(Pub/Sub)。 一、主题模式特点 客户端包括发布者和订阅者 主题中的消息被所有订阅者消费 消费者不能消费订阅之前就发送到主题中的消息 showImg(https:/...

    diabloneo 评论0 收藏0
  • Jakartase_多线程 --- 线程的并发协作模式(一)产者费者模式

    摘要:一简介多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要的多线程并发协作模型生产者消费者模式。对于生产者没有生产产品之前,消费者要进入等待状态。分析不足在生产者消费者问题中,仅有是不够的。 一、简介 多线程环境下,我们经常需要多个线程的并发和协作。 这个时候,就需要了解一个重要的多线程并发协作模型 生产者 / 消费者模式 。 模式简图 showImg(h...

    qianfeng 评论0 收藏0
  • python 产者费者模式

    摘要:为什么使用生产者消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。什么是生产者消费者模式生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。 ...

    cjie 评论0 收藏0
  • ActiveMQ的消息模式——队列模式(Queue)

    摘要:一队列模式特点客户端包括生产者和消费者队列中的消息只能被一个消费者消费消费者可以随时消费队列中的消息二创建过程创建连接创建会话通过来创建其它的将生产者和消费者都会指向目标生产者向目标发送消息消费者设置监听器,监听消息。 前言 此处的代码只是简化理解,实际项目会结合Spring使用。 一、队列模式特点 客户端包括生产者和消费者 队列中的消息只能被一个消费者消费 消费者可以随时消费队列中...

    shery 评论0 收藏0
  • 并发编程中级篇三----并行设计模式----产者-费者模式

    摘要:生产者消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。生产者消费者模式中的内存缓冲区的主要功能是数据在多线程间的共享。 生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过...

    Aldous 评论0 收藏0

发表评论

0条评论

Karuru

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<