1. 原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11871704.html

Java线程--BlockingQueue使用

阻塞队列就是内容满了之后, 就开始阻塞, 直到有消费者消费了东西之后才又开始生产, 看代码:

  1. package concurrent.blockingqueue;
  2.  
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.atomic.AtomicInteger;
  5.  
  6. /**
  7. * 生产者
  8. */
  9. public class Producer implements Runnable {
  10.  
  11. /**
  12. * 计数器
  13. */
  14. private static AtomicInteger k = new AtomicInteger(0);
  15. BlockingQueue queue;
  16.  
  17. public Producer(BlockingQueue queue) {
  18. this.queue = queue;
  19. }
  20.  
  21. @Override
  22. public void run() {
  23. while (true) {
  24. try {
  25. /**
  26. * 把生产出来的东西丢进队列中去
  27. */
  28. queue.put(produce());
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. }
  34.  
  35. /**
  36. * 生产东西, 然后返回出去
  37. * @return
  38. * @throws InterruptedException
  39. */
  40. private AtomicInteger produce() throws InterruptedException {
  41. k.addAndGet(1);
  42. System.out.println("生产者开始生产东西了... " + k);
  43. return k;
  44. }
  45. }
  1. package concurrent.blockingqueue;
  2.  
  3. import java.util.concurrent.BlockingQueue;
  4.  
  5. /**
  6. * 消费者
  7. */
  8. public class Consumer implements Runnable {
  9.  
  10. BlockingQueue queue;
  11.  
  12. public Consumer(BlockingQueue queue){
  13. this.queue = queue;
  14. }
  15.  
  16. @Override
  17. public void run() {
  18. while (true) {
  19. try {
  20. /**
  21. * 延迟3秒再从队列中取出,
  22. * 这样就可以看到生产队列生产满了之后就停止生产,
  23. * 直到消费者消费了之后再继续生产
  24. */
  25. Thread.sleep(3000);
  26. consume(queue.take());
  27. } catch (InterruptedException e) {
  28. e.printStackTrace();
  29. }
  30. }
  31. }
  32.  
  33. /**
  34. * 消费东西
  35. * @param o
  36. */
  37. void consume(Object o){
  38. System.out.println("消费者开始消费东西了.... " + o);
  39. }
  40. }
  1. package concurrent.blockingqueue;
  2.  
  3. import java.util.concurrent.ArrayBlockingQueue;
  4. import java.util.concurrent.BlockingQueue;
  5.  
  6. /**
  7. * main 测试类
  8. */
  9. public class MainTest {
  10. public static void main(String[] args) {
  11. /**
  12. * 搞一个阻塞队列容量为3, 当超过容量就开始堵塞
  13. */
  14. BlockingQueue queue = new ArrayBlockingQueue(3);
  15. new Thread(new Producer(queue)).start();
  16. new Thread(new Consumer(queue)).start();
  17. }
  18. }

看打印结果:

  1. 生产者开始生产东西了... 1
  2. 生产者开始生产东西了... 2
  3. 生产者开始生产东西了... 3
  4. 生产者开始生产东西了... 4
  5. 消费者开始消费东西了.... 4
  6. 生产者开始生产东西了... 5
  7. 消费者开始消费东西了.... 5
  8. 生产者开始生产东西了... 6
  9. 消费者开始消费东西了.... 6
  10. 生产者开始生产东西了... 7
  11. 消费者开始消费东西了.... 7
  12. 生产者开始生产东西了... 8
  13. 消费者开始消费东西了.... 8
  14. 生产者开始生产东西了... 9
  15. 消费者开始消费东西了.... 9
  16. 生产者开始生产东西了... 10

这个结果很明显了.

Java线程--BlockingQueue使用的更多相关文章

  1. Java线程和多线程(十一)——BlockingQueue

    这次讨论的是Java的BlockingQueue,java.util.concurrent.BlockingQueue是一个Java的队列接口,支持一系列操作,比如,在获取和移除对象的时候如果队列为空 ...

  2. 转:JAVA线程池ThreadPoolExecutor与阻塞队列BlockingQueue

    从Java5开始,Java提供了自己的线程池.每次只执行指定数量的线程,java.util.concurrent.ThreadPoolExecutor 就是这样的线程池.以下是我的学习过程. 首先是构 ...

  3. java线程(7)——阻塞队列BlockingQueue

    回顾: 阻塞队列,英文名叫BlockingQueue.首先他是一种队列,联系之前Java基础--集合中介绍的Queue与Collection,我们就很容易开始今天的阻塞队列的学习了.来看一下他们的接口 ...

  4. JAVA线程队列BlockingQueue

    JAVA线程队列BlockingQueue 介绍 BlockingQueue阻塞队列,顾名思义,首先它是一个队列,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出. 常用的队列主要有以 ...

  5. Java线程并发:知识点

    Java线程并发:知识点   发布:一个对象是使它能够被当前范围之外的代码所引用: 常见形式:将对象的的引用存储到公共静态域:非私有方法中返回引用:发布内部类实例,包含引用.   逃逸:在对象尚未准备 ...

  6. Java 线程池框架核心代码分析--转

    原文地址:http://www.codeceo.com/article/java-thread-pool-kernal.html 前言 多线程编程中,为每个任务分配一个线程是不现实的,线程创建的开销和 ...

  7. 【转载】 Java线程面试题 Top 50

    Java线程面试题 Top 50 不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题.Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员 的欢迎.大多数待遇丰厚的J ...

  8. Java线程新特征——Java并发库

    一.线程池   Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定 ...

  9. Java线程池使用说明

    Java线程池使用说明 转自:http://blog.csdn.net/sd0902/article/details/8395677 一简介 线程的使用在java中占有极其重要的地位,在jdk1.4极 ...

随机推荐

  1. Windows下SQL Server数据库的安装

    由于工作需要出一版教程,记录一下安装过程,用到的数据库是SQL Server2014版本 下载地址为:SQL Server2014下载 提取码:6666 下载好安装包,首先右键,装载 装载完, 会有这 ...

  2. Kerberos加密级别不支持的问题

    1.问题现象 Zookeeper开启kerberos认证后出现如下问题,不支持的加密级别: 2017-02-23 09:20:57,048 [myid:1] - WARN [NIOWorkerThre ...

  3. 初识python: 斐波拉契数(生成器获取)

    使用  生成器(yield) 获取斐波拉契数. 代码如下: def fun(n): a,b,c = 0,0,1 while a < n: yield b # b, c = c, b + c 以下 ...

  4. 在使用django admin的后台搜索时报错

    在使用django admin的后台搜索时报错 百度说在search_fields中定义了非字符串字段,最后发现author引用了外键 解决办法: 有外健时应写成: 本表外键字段__外键所在表所需要查 ...

  5. Go语言发邮件

    发送邮件是实际业务中经常会用到的一个功能,而在Go语言中实现发送邮件的库也有很多,这篇文章将介绍go语言中如何发邮件. 1. 登录QQ邮箱,选择账户,开启POP3/SMTP服务和IMAP/SMTP服务 ...

  6. LINUX学习-Mysql集群-一主多从

    新建一台服务器 192.168.88.40 yum -y install mysql mysql-server 编辑etc下的配置文件 vim /etc/my.cnf 输入 bin-log=mysql ...

  7. vuex获取数据

    cmd窗口vue add vuex后出现store文件夹,在里面的index.js里面设置state属性,可以在视图页面home.vue文件中获取. 方法1: //在项目当中引入router以后 就多 ...

  8. 移动Web开发实践——解决position:fixed自适应BUG

    在移动web中使用position:fixed,会踩到很多坑,在我之前的一篇文章<移动端web页面使用position:fixed问题总结>中已经总结了很多bug,但是在后续的开发中有关f ...

  9. 开启mysql外部访问(root外连)

    MySQL外部访问 mysql 默认是禁止远程连接的,你在安装mysql的系统行运行mysql -u root -p 后进入mysql 输入如下: mysql>use mysql; mysql& ...

  10. USB Tethering always displays grey when USB tethering type is Linux(EEM)

    USB Tethering always displays grey when USB tethering type is Linux(EEM) 1.Problem DESCRIPTION USB T ...