Java线程--BlockingQueue使用
2024-10-17 12:05:27
原创:转载需注明原创地址 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
这个结果很明显了.
最新文章
- android 一条线
- 深入理解JavaScript闭包(closure)
- H264 帧结构分析、帧判断
- 第一篇、Swift_搭建UITabBarController + 4UINavigationController主框架
- Unity3d 获取屏幕depth与normal
- 原型扩展的方法解决IE和Firefox的Js兼容问题
- FZU 1894 (双端队列)
- UIPageControl的一个Demo
- 合理设置MTU,提升下载速度
- testbench中将外部数据引入输出的方法(转载)
- asp.net core 配置
- 在Python脚本中调用Django环境
- 1346:【例4-7】亲戚(relation)
- linux内核分析第六次实验
- SAP PP顾问面试题及资料
- IDEA的这八条配置你一定要改!
- Azure PowerShell (13) 批量设置Azure ARM Network Security Group (NSG)
- Nginx服务器之负载均衡策略
- Java I/O学习 标准的I/O重定向
- MyBatis+Spring SQL效率测试报告
热门文章
- Java程序设计基础笔记 • 【第3章 运算符与表达式】
- docker构建.net core运行的镜像
- Python项目生成requirements.txt文件及pip升级问题解决及流程
- 深入 Laravel 内核之装饰模式
- Microsoft HoloLens 开发(3): 全息图交互方式 - Gaze
- CentOS 7 如何清空文件内容
- spring clould -多模块 -swagger2 配置 nginx 的正确设置
- 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
- HDU 2044 一只小蜜蜂... (斐波那契数列)
- dubbo泛化引发的生产故障之dubbo隐藏的坑