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

Java线程--BlockingQueue使用

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

package concurrent.blockingqueue;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger; /**
* 生产者
*/
public class Producer implements Runnable { /**
* 计数器
*/
private static AtomicInteger k = new AtomicInteger(0);
BlockingQueue queue; public Producer(BlockingQueue queue) {
this.queue = queue;
} @Override
public void run() {
while (true) {
try {
/**
* 把生产出来的东西丢进队列中去
*/
queue.put(produce());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* 生产东西, 然后返回出去
* @return
* @throws InterruptedException
*/
private AtomicInteger produce() throws InterruptedException {
k.addAndGet(1);
System.out.println("生产者开始生产东西了... " + k);
return k;
}
}
package concurrent.blockingqueue;

import java.util.concurrent.BlockingQueue;

/**
* 消费者
*/
public class Consumer implements Runnable { BlockingQueue queue; public Consumer(BlockingQueue queue){
this.queue = queue;
} @Override
public void run() {
while (true) {
try {
/**
* 延迟3秒再从队列中取出,
* 这样就可以看到生产队列生产满了之后就停止生产,
* 直到消费者消费了之后再继续生产
*/
Thread.sleep(3000);
consume(queue.take());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} /**
* 消费东西
* @param o
*/
void consume(Object o){
System.out.println("消费者开始消费东西了.... " + o);
}
}
package concurrent.blockingqueue;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; /**
* main 测试类
*/
public class MainTest {
public static void main(String[] args) {
/**
* 搞一个阻塞队列容量为3, 当超过容量就开始堵塞
*/
BlockingQueue queue = new ArrayBlockingQueue(3);
new Thread(new Producer(queue)).start();
new Thread(new Consumer(queue)).start();
}
}

看打印结果:

生产者开始生产东西了... 1
生产者开始生产东西了... 2
生产者开始生产东西了... 3
生产者开始生产东西了... 4
消费者开始消费东西了.... 4
生产者开始生产东西了... 5
消费者开始消费东西了.... 5
生产者开始生产东西了... 6
消费者开始消费东西了.... 6
生产者开始生产东西了... 7
消费者开始消费东西了.... 7
生产者开始生产东西了... 8
消费者开始消费东西了.... 8
生产者开始生产东西了... 9
消费者开始消费东西了.... 9
生产者开始生产东西了... 10

这个结果很明显了.

最新文章

  1. android 一条线
  2. 深入理解JavaScript闭包(closure)
  3. H264 帧结构分析、帧判断
  4. 第一篇、Swift_搭建UITabBarController + 4UINavigationController主框架
  5. Unity3d 获取屏幕depth与normal
  6. 原型扩展的方法解决IE和Firefox的Js兼容问题
  7. FZU 1894 (双端队列)
  8. UIPageControl的一个Demo
  9. 合理设置MTU,提升下载速度
  10. testbench中将外部数据引入输出的方法(转载)
  11. asp.net core 配置
  12. 在Python脚本中调用Django环境
  13. 1346:【例4-7】亲戚(relation)
  14. linux内核分析第六次实验
  15. SAP PP顾问面试题及资料
  16. IDEA的这八条配置你一定要改!
  17. Azure PowerShell (13) 批量设置Azure ARM Network Security Group (NSG)
  18. Nginx服务器之负载均衡策略
  19. Java I/O学习 标准的I/O重定向
  20. MyBatis+Spring SQL效率测试报告

热门文章

  1. Java程序设计基础笔记 • 【第3章 运算符与表达式】
  2. docker构建.net core运行的镜像
  3. Python项目生成requirements.txt文件及pip升级问题解决及流程
  4. 深入 Laravel 内核之装饰模式
  5. Microsoft HoloLens 开发(3): 全息图交互方式 - Gaze
  6. CentOS 7 如何清空文件内容
  7. spring clould -多模块 -swagger2 配置 nginx 的正确设置
  8. android 解决报错 installation failed with message Failed to finalize session : INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION: Failed parse during installPackageLI: Failed to read manifest from /xx/xx/xx.apk
  9. HDU 2044 一只小蜜蜂... (斐波那契数列)
  10. dubbo泛化引发的生产故障之dubbo隐藏的坑