使用Java的BlockingQueue实现生产者-消费者

BlockingQueue也是java.util.concurrent下的主要用来控制线程同步的工具。

BlockingQueue有四个具体的实现类,根据不同需求,选择不同的实现类
1、ArrayBlockingQueue:一个由数组支持的有界阻塞队列,规定大小的BlockingQueue,其构造函数必须带一个int参数来指明其大小.其所含的对象是以FIFO(先入先出)顺序排序的。


2、LinkedBlockingQueue:大小不定的BlockingQueue,若其构造函数带一个规定大小的参数,生成的BlockingQueue有大小限制,若不带大小参数,所生成的BlockingQueue的大小由Integer.MAX_VALUE来决定.其所含的对象是以FIFO(先入先出)顺序排序的。


3、PriorityBlockingQueue:类似于LinkedBlockQueue,但其所含对象的排序不是FIFO,而是依据对象的自然排序顺序或者是构造函数的Comparator决定的顺序。


4、SynchronousQueue:特殊的BlockingQueue,对其的操作必须是放和取交替完成的。

 

LinkedBlockingQueue 可以指定容量,也可以不指定,不指定的话,默认最大是Integer.MAX_VALUE,其中主要用到put和take方法,put方法在队列满的时候会阻塞直到有队列成员被消费,take方法在队列空的时候会阻塞,直到有队列成员被放进来。

 

生产者消费者的示例代码:

生产者:

Java代码  收藏代码
  1. import java.util.concurrent.BlockingQueue;  
  2.   
  3. public class Producer implements Runnable {  
  4.     BlockingQueue<String> queue;  
  5.   
  6.     public Producer(BlockingQueue<String> queue) {  
  7.         this.queue = queue;  
  8.     }  
  9.   
  10.     @Override  
  11.     public void run() {  
  12.         try {  
  13.             String temp = "A Product, 生产线程:"  
  14.                     + Thread.currentThread().getName();  
  15.             System.out.println("I have made a product:"  
  16.                     + Thread.currentThread().getName());  
  17.             queue.put(temp);//如果队列是满的话,会阻塞当前线程  
  18.         } catch (InterruptedException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22.   
  23. }  

 

 消费者:

Java代码  收藏代码
  1. import java.util.concurrent.BlockingQueue;  
  2.   
  3. public class Consumer implements Runnable{  
  4.     BlockingQueue<String> queue;  
  5.       
  6.     public Consumer(BlockingQueue<String> queue){  
  7.         this.queue = queue;  
  8.     }  
  9.       
  10.     @Override  
  11.     public void run() {  
  12.         try {  
  13.             String temp = queue.take();//如果队列为空,会阻塞当前线程  
  14.             System.out.println(temp);  
  15.         } catch (InterruptedException e) {  
  16.             e.printStackTrace();  
  17.         }  
  18.     }  
  19. }  

 测试类:

Java代码  收藏代码
  1. import java.util.concurrent.ArrayBlockingQueue;  
  2. import java.util.concurrent.BlockingQueue;  
  3. import java.util.concurrent.LinkedBlockingQueue;  
  4.   
  5. public class Test3 {  
  6.   
  7.     public static void main(String[] args) {  
  8.         BlockingQueue<String> queue = new LinkedBlockingQueue<String>(2);  
  9.         // BlockingQueue<String> queue = new LinkedBlockingQueue<String>();  
  10.         //不设置的话,LinkedBlockingQueue默认大小为Integer.MAX_VALUE  
  11.           
  12.         // BlockingQueue<String> queue = new ArrayBlockingQueue<String>(2);  
  13.   
  14.         Consumer consumer = new Consumer(queue);  
  15.         Producer producer = new Producer(queue);  
  16.         for (int i = 0; i < 5; i++) {  
  17.             new Thread(producer, "Producer" + (i + 1)).start();  
  18.   
  19.             new Thread(consumer, "Consumer" + (i + 1)).start();  
  20.         }  
  21.     }  
  22. }  

 打印结果:

Text代码  收藏代码
  1. I have made a product:Producer1  
  2. I have made a product:Producer2  
  3. A Product, 生产线程:Producer1  
  4. A Product, 生产线程:Producer2  
  5. I have made a product:Producer3  
  6. A Product, 生产线程:Producer3  
  7. I have made a product:Producer5  
  8. I have made a product:Producer4  
  9. A Product, 生产线程:Producer5  
  10. A Product, 生产线程:Producer4  

 

由于队列的大小限定成了2,所以最多只有两个产品被加入到队列当中,而且消费者取到产品的顺序也是按照生产的先后顺序,原因就是LinkedBlockingQueue和ArrayBlockingQueue都是按照FIFO的顺序存取元素的。


来源: <http://tonl.iteye.com/blog/1936391>


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/553796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win7系统怎么查看主板信息

win7系统怎么查看主板信息?主板是一台计算机最重要的硬件设备之一&#xff0c;它不仅是所有硬件系统的核心&#xff0c;也是机箱中最大的电路板。今天小编就给大家带来了win7系统查看主板信息的方法&#xff0c;一起来看看win7系统怎么查看主板信息的吧。 win7系统怎么查看主…

Mybatis判断int类型是否为空

症状 : 域名筛选在选择正式,测试的时候没问题,选择终止的时候筛选结果不对分析:正式:1测试:2终止:0不选:null选择终止的时候得到了和不选一样的结果,下图为sql判断语句,以前一直都是这么判断的没有出现过问题 错误所在:通过观察log打印的sql语句发现status0时上述条件是不成立的…

win7电脑蓝屏的解决方法

在我们使用电脑的过程中想必有很多人都会遇到蓝屏现象吧&#xff0c;蓝屏指的是操作系统在无法从一个系统错误中恢复过来时所显示的屏幕图像&#xff0c;导致蓝屏现象的原因有很多&#xff0c;今天我们来看看win7电脑蓝屏的解决方法吧。 win7电脑蓝屏的解决方法 1、今天带来的…

$.extend()和(function($){….})(jQuery)

1. JS中substring与substr的区别 之前在项目中用到substring方法&#xff0c;因为C#中也有字符串的截取方法Substring方法&#xff0c;当时也没有多想就误以为这两种方法的使用时一样的。这样就直接按照在C#中使用Substring的方式&#xff0c;直接在js中用了substring&#…

积米浏览器如何清除浏览数据

相信大家都知道&#xff0c;大多数浏览器都会自动缓存浏览数据&#xff0c;而缓存的数据多了也就会直接影响到网页的浏览速度&#xff0c;所以最好是能够经常或者定期去清除浏览数据。那么&#xff0c;如何清除浏览数据呢?下面&#xff0c;以积米浏览器为例&#xff0c;我们一…

Java文件保存与删除工具类

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream;/*** * author ahomeeye* * 2012-7-26 下午3:50:50 文件操作工具类*/ public class FileUtil {// 保存文件public static void saveFile(String newsRootPath, String filename…

win7在网上邻居上看不到别的电脑如何解决

近期在网上看到很多用户询问说win7纯净版系统在网上邻居上看不到别的电脑是什么情况呢?一般情况下&#xff0c;我们可以通过网上邻居和别的电脑共享文件、图片、视频等等。可是有时候Win7系统在网上邻居上看不到别的电脑&#xff0c;也无法搜索到。有什么办法能解决此故障问题…

循环删除List集合的错误

症状:不是郝柱也能看到灾备分析:调试发现动作中有两个灾备,不过只过滤了其中一个 错误所在:代码如下,这里for循环删除List逻辑出问题了,犯了一个比较基础的错误 : 两个灾备动作索引是相邻的,当我remove掉第一个时紧跟着的动作就会取代它原来的位置,最终导致问题发生 修改方案:解…

win10使用网络共享功能的方法

win10系统有一个网络共享功能&#xff0c;可以实现局域网之间文件和打印机的共享操作&#xff0c;从而有效提高资源共享&#xff0c;实现更高效的办公需求。好多新手用户不知道网络共享功能怎么使用?为此&#xff0c;本文教程来和大家详细说明一些使用方法。 具体方法如下: …

JSON转List

JSON转List在平时的开发中经常遇到&#xff0c;这里介绍两张方法&#xff1a; 1.使用jackson&#xff08;推荐&#xff0c;支持嵌套复杂结构&#xff09;&#xff1a; ObjectMapper mapper new ObjectMapper(); JavaType javaType mapper.getTypeFactory().constructPara…

双击ie浏览器没反应打不开的解决方法

双击ie浏览器后没反应怎么办?双击ie浏览器打不开怎么解决?ie浏览器是众多网民朋友比较熟悉的网页浏览器之一&#xff0c;但是不少用户经常会遇到双击ie浏览器没反应或者双击ie浏览器打不开的尴尬情况&#xff0c;这个问题要如何解决呢?为此小编特整理下文&#xff0c;以下解…

ajax中return取不到值的问题

症状:机器迁移时判断JS返回取不到值分析 :调试发现data是有值的&#xff0c;而且下断点调试发现这段ajax还没走完&#xff0c;后面的逻辑已经开始走了错误所在:ajax之所以叫ajax它首先是异步的&#xff0c;顺序执行的程序不需要等待ajax跑完才继续执行 修改方案:将默认为true的…

UC浏览器如何调节手机屏幕亮度

uc浏览器是一个非常好用的社交服务软件&#xff0c;用户可以使用手机随时进行线上搜索&#xff0c;这款软件使用超级的方便&#xff0c;用户在线上阅读的时候&#xff0c;有很多功能可以使用&#xff0c;在进行线上阅读的时候&#xff0c;可以对页面的文字&#xff0c;背景&…

linux的nohup命令的用法

在应用Unix/Linux时&#xff0c;我们一般想让某个程序在后台运行&#xff0c;于是我们将常会用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台&#xff1a; /usr/local/mysql/bin/mysqld_safe –usermysql &。可是有很多程序并不想mysqld一样&#xff0c;这…

谷歌浏览器如何添加信任网址 Chrome浏览器信任网址添加方法分享

和许多国产浏览器产品一样&#xff0c;谷歌旗下的Chrome浏览器中也可以将部分站点设置为信任网址&#xff0c;以便避免权限获取提示的“骚扰”。那么&#xff0c;谷歌浏览器要如何添加信任网址?不清楚具体操作的朋友&#xff0c;可以看看小编分享的Chrome浏览器信任网址添加方…

Websocket判断逻辑Bug

症状:灾备后台失败但前台提示成功分析 :下断点发现此时前端的data.obj为undifined&#xff0c;后台pyhon脚本执行报错了 错误所在:前台判断不应该加上undifined 修改方案:第一次修改如上&#xff0c;判断严谨多了&#xff0c;但是运行是前台报不能对undefined使用length分析 :…

QQ浏览器的历史记录在那 QQ浏览器查看浏览历史的方法

QQ浏览器是不少用户选择安装的一款实用性不错的浏览器&#xff0c;在使用这款浏览器的时候有不少功能注意不到&#xff0c;如QQ浏览器怎么查找历史记录等等&#xff0c;下面小编就带大家查看QQ浏览器的历史记录的步骤&#xff0c;帮助大家找回意外关闭或者未加保存到书签的网站…

SpringMVC深度探险 —— SpringMVC核心配置文件详解

在上一篇文章中&#xff0c;我们从DispatcherServlet谈起&#xff0c;最终为读者详细分析了SpringMVC的初始化主线的全部过程。整个初始化主线的研究&#xff0c;其实始终围绕着DispatcherServlet、WebApplicationContext和组件这三大元素之间的关系展开。 在文章写完之后&…

win7更改用户登录或注销方式的操作教程

我们可以通过更改用户登录或注销方式的办法保护我们的电脑不被其他人登录使用&#xff0c;如果有其他人要登录使用我们的电脑就会出现类似下图的提示&#xff0c;下面就一起来看一下win7更改用户登录或注销方式的操作教程吧。 win7更改用户登录或注销方式的操作教程 1、首先使…

Java下载文件的几种方式

public HttpServletResponse download(String path, HttpServletResponse response) {try {// path是指欲下载的文件的路径。File file new File(path);// 取得文件名。String filename file.getName();// 取得文件的后缀名。String ext filename.substring(filename.lastIn…