摘要:生产着,消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。生产者消费者模式中的内存缓冲区主要功能是数据在多线程间的共享,此外,通过该缓冲区,可以缓解生产者和消费者间的性能差。
生产着,消费者模式是一个经典的多线程设计模式,它为多线程间的协作提供了良好的解决方案。 通常有两个角色: 若干个生产者线程,若个个消费者线程。生产者线程负责提交用户的请求,消费者线程负责具体处理生产者提交的任务。生产者和消费者之间则通过共享内存缓冲区进行通信。 生产者-消费者模式中的内存缓冲区主要功能是数据在多线程间的共享,此外,通过该缓冲区,可以缓解生产者和消费者间的性能差。
public class Main {
public static void main(String[] args) throws InterruptedException { BlockingQueuequeue = 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 BlockingQueuequeue; 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 BlockingQueuequeue; 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
摘要:主题模式又名发布订阅者模式。先启动两个消费者,然后启动生产者发布条消息,这时两个消费者都可以消费服务器中的每一条消息。这就是主题模式的特点每个订阅者都可以消费主题模式中的每一条消息。 主题模式 又名 发布订阅者模式(Pub/Sub)。 一、主题模式特点 客户端包括发布者和订阅者 主题中的消息被所有订阅者消费 消费者不能消费订阅之前就发送到主题中的消息 showImg(https:/...
摘要:一简介多线程环境下,我们经常需要多个线程的并发和协作。这个时候,就需要了解一个重要的多线程并发协作模型生产者消费者模式。对于生产者没有生产产品之前,消费者要进入等待状态。分析不足在生产者消费者问题中,仅有是不够的。 一、简介 多线程环境下,我们经常需要多个线程的并发和协作。 这个时候,就需要了解一个重要的多线程并发协作模型 生产者 / 消费者模式 。 模式简图 showImg(h...
摘要:为什么使用生产者消费者模式在线程世界里,生产者就是生产数据的线程,消费者就是消费数据的线程。什么是生产者消费者模式生产者消费者模式是通过一个容器来解决生产者和消费者的强耦合问题。 ...
摘要:一队列模式特点客户端包括生产者和消费者队列中的消息只能被一个消费者消费消费者可以随时消费队列中的消息二创建过程创建连接创建会话通过来创建其它的将生产者和消费者都会指向目标生产者向目标发送消息消费者设置监听器,监听消息。 前言 此处的代码只是简化理解,实际项目会结合Spring使用。 一、队列模式特点 客户端包括生产者和消费者 队列中的消息只能被一个消费者消费 消费者可以随时消费队列中...
摘要:生产者消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。生产者消费者模式中的内存缓冲区的主要功能是数据在多线程间的共享。 生产者-消费者模式是一个经典的多线程设计模式,它为多线程的协作提供了良好的解决方案。在生产者-消费者模式中,通常有两类线程,即若干个生产者线程和若干个消费者线程。生产者线程负责提交用户请求,消费者线程负责处理用户请求。生产者和消费者之间通过...
阅读 3036·2023-04-25 20:09
阅读 3319·2021-11-23 09:51
阅读 1973·2021-11-22 15:25
阅读 3350·2021-11-18 10:02
阅读 2749·2021-09-27 13:56
阅读 1306·2019-08-30 15:44
阅读 1150·2019-08-30 13:21
阅读 3324·2019-08-30 11:05