多线程下的生产者和消费者 - BlockingQueue

简介:

   1.BlockingQueue:支持两个附加操作的 Queue,这两个操作是:检索元素时等待队列变为非空,以及存储元素时等待空间变得可用。

  2.BlockingQueue 不接受 null 元素。

  3.BlockingQueue 可以是限定容量的。

  4.BlockingQueue 实现是线程安全的。Queue不是线程安全的。因此可以将Blockingqueue用于用于生产者-使用者队列

 
  1. import java.util.*; 
  2. import java.util.concurrent.*; 
  3.  
  4. class Producer 
  5.     implements Runnable 
  6.     private BlockingQueue<String> drop; 
  7.     List<String> messages = Arrays.asList( 
  8.         "Mares eat oats"
  9.         "Does eat oats"
  10.         "Little lambs eat ivy"
  11.         "Wouldn't you eat ivy too?"); 
  12.          
  13.     public Producer(BlockingQueue<String> d) { this.drop = d; } 
  14.      
  15.     public void run() 
  16.     { 
  17.         try 
  18.         { 
  19.             for (String s : messages) 
  20.                 drop.put(s); 
  21.             drop.put("DONE"); 
  22.         } 
  23.         catch (InterruptedException intEx) 
  24.         { 
  25.             System.out.println("Interrupted! " +  
  26.                 "Last one out, turn out the lights!"); 
  27.         } 
  28.     }     
  29.  
  30. class Consumer 
  31.     implements Runnable 
  32.     private BlockingQueue<String> drop; 
  33.     public Consumer(BlockingQueue<String> d) { this.drop = d; } 
  34.      
  35.     public void run() 
  36.     { 
  37.         try 
  38.         { 
  39.             String msg = null
  40.             while (!((msg = drop.take()).equals("DONE"))) 
  41.                 System.out.println(msg); 
  42.         } 
  43.         catch (InterruptedException intEx) 
  44.         { 
  45.             System.out.println("Interrupted! " +  
  46.                 "Last one out, turn out the lights!"); 
  47.         } 
  48.     } 
  49.  
  50. public class ABQApp 
  51.     public static void main(String[] args) 
  52.     { 
  53.         BlockingQueue<String> drop = new ArrayBlockingQueue(1true); 
  54.         (new Thread(new Producer(drop))).start(); 
  55.         (new Thread(new Consumer(drop))).start(); 
  56.     } 

 

 

 本文转自 tianya23 51CTO博客,原文链接:http://blog.51cto.com/tianya23/683090,如需转载请自行联系原作者

相关文章
|
2月前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
24 1
|
7月前
|
存储 安全 Java
Qt线程池+生产者消费者模型
Qt线程池+生产者消费者模型
303 5
|
2月前
|
消息中间件 NoSQL 关系型数据库
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
【多线程-从零开始-捌】阻塞队列,消费者生产者模型
29 0
|
4月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
4月前
|
消息中间件 设计模式 安全
多线程魔法:揭秘一个JVM中如何同时运行多个消费者
【8月更文挑战第22天】在Java虚拟机(JVM)中探索多消费者模式,此模式解耦生产与消费过程,提升系统性能。通过`ExecutorService`和`BlockingQueue`构建含2个生产者及4个消费者的系统,实现实时消息处理。多消费者模式虽增强处理能力,但也引入线程安全与资源竞争等挑战,需谨慎设计以确保高效稳定运行。
98 2
|
4月前
|
安全 Java
Java模拟生产者-消费者问题。生产者不断的往仓库中存放产品,消费者从仓库中消费产品。其中生产者和消费者都可以有若干个。在这里,生产者是一个线程,消费者是一个线程。仓库容量有限,只有库满时生产者不能存
该博客文章通过Java代码示例演示了生产者-消费者问题,其中生产者在仓库未满时生产产品,消费者在仓库有产品时消费产品,通过同步机制确保多线程环境下的线程安全和有效通信。
|
5月前
|
设计模式 安全 NoSQL
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
Java面试题:设计一个线程安全的单例模式,并解释其内存占用和垃圾回收机制;使用生产者消费者模式实现一个并发安全的队列;设计一个支持高并发的分布式锁
73 0
|
5月前
|
存储 设计模式 监控
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
Java面试题:如何在不牺牲性能的前提下,实现一个线程安全的单例模式?如何在生产者-消费者模式中平衡生产和消费的速度?Java内存模型规定了变量在内存中的存储和线程间的交互规则
53 0
|
7月前
|
设计模式 安全 Java
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)
63 2
|
6月前
|
安全 Linux 数据安全/隐私保护
【linux】线程同步和生产消费者模型
【linux】线程同步和生产消费者模型
42 0