多生产者多消费者(第二种方式2.1)基于BlockingQueue
public class Producer implements Runnable { //静态变量只初始化一次
private static AtomicInteger count = new AtomicInteger(); private volatile boolean isRunning = true;
private BlockingQueue<String> queue;
private String name; public Producer(BlockingQueue<String> queue, String name) {
this.queue = queue;
this.name = name;
} public void run() {
String data = null;
Random r = new Random();
System.out.println("启动" + name);
try {
while (isRunning) {
Thread.sleep(r.nextInt());
data = "data:" + count.incrementAndGet();
System.out.println(name + "生产数据:" + data);
queue.put(data);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "退出!");
} public void stop() {
isRunning = false;
} }
public class Consumer implements Runnable {
private volatile boolean isRunning = true;
private BlockingQueue<String> queue;
private String name; public Consumer(BlockingQueue<String> queue, String name) {
this.queue = queue;
this.name = name;
} public void run() {
System.out.println("启动" + name);
try {
while (isRunning) {
String data = queue.take();
System.out.println(name + "消费数据:" + data);
Thread.sleep();
}
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(name + "退出!");
} public void stop() {
isRunning = false;
}
}
public class Client { public static void main(String[] args) throws InterruptedException {
// 声明一个容量为10的缓存队列
BlockingQueue<String> queue = new LinkedBlockingQueue<String>(); Producer producer1 = new Producer(queue , "【生产者一】");
Producer producer2 = new Producer(queue ,"【生产者二】");
Consumer consumer1 = new Consumer(queue ,"【消费者一】");
// 借助Executors
ExecutorService service = Executors.newCachedThreadPool();
// 启动线程
service.execute(producer1);
service.execute(producer2);
service.execute(consumer1); // 执行7s
Thread.sleep( * );
producer1.stop();
producer2.stop();
service.shutdown(); }
}
队列的操作:
offer 是向队列尾部添加元素,返回true或者false
poll 是从队列头部取数据,如果没有取到返回null
offer和poll都不会阻塞当前线程
阻塞操作
put 往队列当中中放入数据
take 从队列当中取数据
多生产者多消费者(第二种方式2.1)基于BlockingQueue的更多相关文章
- Java创建线程的第二种方式:实现runable接口
/*需求:简单的卖票程序多个窗口买票 创建线程的第二种方式:实现runable接口 *//*步骤1.定义类实现Runable接口2.覆盖Runable接口中的run方法 将线程要运行的代码存放在 ...
- JS定义函数的2种方式以及区别简述(为什么推荐第二种方式)
无意中看到了阮一峰大神多年前的一篇博客: 12种不宜使用的Javascript语法 看到第9条的时候受到了启发,感觉之前没怎么理解清楚的一些问题好像突然就清晰了,如下图 可能光这样看,有些小伙 ...
- Spring整合Struts2框架的第二种方式(Action由Spring框架来创建)(推荐大家来使用的)
1. spring整合struts的基本操作见我的博文:https://www.cnblogs.com/wyhluckdog/p/10140588.html,这里面将spring与struts2框架整 ...
- 创建线程的第二种方式------实现Runnable接口的方式
package cn.itcast.demo16.Demo07.Runnable;/** * @author newcityman * @date 2019/7/22 - 23:17 */public ...
- 多线程-创建线程第二种方式-实现Runnable接口-细节和好处
1 package multithread2; 2 3 /* 4 * 创建线程的第一种方法:继承Thread类 5 * 6 * 创建线程的第二种方式:实现Runnable接口 7 * 8 * 1,定义 ...
- Thread类的常用方法_sleep和创建多线程程序的第二种方式_实现Runnable接口
sleep方法是在Thread类中的一个静态方法,当一个线程调用了sleep方法,被调用的那个线程就会暂时的让出指定时间的CPU执行权,在这段时间也不会参与CPU的调度,当时间到了之后,就会重新回到就 ...
- throws关键字_异常处理的第一种方式(交给别人处理)和try_catch_异常处理的第二种方式(自己处理)
throws关键字:异常处理的第一种方式,交给别人处理 作用: 当方法内部抛出异常对象的时候,那么我们就必须处理这个异常对象 可以使用throws关键字处理异常对象, 会把异常对象声明抛出给方法的调用 ...
- 第二种方式读取并显示HDFS中的内容
1.讀取HDFS内容的java客戶端代碼: package Hdfs; import java.io.InputStream; import java.net.URI; import org.apac ...
- Struts2框架的数据封装一之属性封装(属性封装的第二种方式:封装成javaBean)
Struts2中提供了两类数据封装的方式? 第一种方式:属性驱动(有两种方式:一个对属性,另外一个是将参数封装到javaBean中) B. 在页面上,使用OGNL表达式进行数据封装.(将参数封装到ja ...
- SpringMVC实现操作的第二种方式
一: 运行效果: 点击提交之后显示效果 二: (1).web.xml <?xml version="1.0" encoding="UTF-8"?> ...
随机推荐
- [TJOI2015]概率论——期望&&母函数
题意 求一个含有 $n$ 个结点的有序二叉树的叶子节点的期望个数.($n \leq 10^9$) 分析 一堆推导..... 得 $ans = \frac{n(n+1)}{2(2n-1)}$ #incl ...
- 关于我&声明
声明 本站内容仅作记录,严禁私人用于参考用药或诊断!请遵循医嘱. 访问本站请确保您有一定的医学知识,本人不对任何个人或团体因参考本站文章负法律责任! 关于 医学生,资深玩家. Logo [ Logo ...
- Parametric and Nonparametric Algorithms
即参数化算法和非参数化算法. 参数化机器学习算法 可以大大简化学习过程,也可以限制可以学到的东西,将函数简化为已知形式的算法称为参数化机器学习算法.算法包括两个步骤: 为函数选择一个form. 从训练 ...
- JavaScript的深入理解(1)
(1)什么是JavaScript? JavaScript是一种专为与网页交互而设计的脚本语言,由三个部分组成:(1).ECMAScript :提供核心语言功能.(2).文档对象模型(DOM):提供访问 ...
- asp.net web开发——文件夹的上传和下载
ASP.NET上传文件用FileUpLoad就可以,但是对文件夹的操作却不能用FileUpLoad来实现. 下面这个示例便是使用ASP.NET来实现上传文件夹并对文件夹进行压缩以及解压. ASP.NE ...
- java解决大文件断点续传
第一点:Java代码实现文件上传 FormFile file = manform.getFile(); String newfileName = null; String newpathname = ...
- pgloader 学习(四)一些简单操作例子
上边已经说明了pgloader 的基本使用(篇理论),但是对于实际操作偏少,以下是一个简单的操作 不像官方文档那样,我为了方便,直接使用docker-compose 运行,同时这个环境,会在后边大部分 ...
- 学生管理系统(Nodejs)
一.项目介绍 ①使用nodejs+bootstrap开发 ②对文件进行合理的模块化 ③实现基本的增删改查功能 二.思路 ①处理模块,处理模块,配置开发静态资源,配置模块引擎 ②路由设计,提取路由模块 ...
- springboot2.0整合redis作为缓存以json格式存储对象
步骤1 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr ...
- spring boot中控制台打印sql日志
.properties文件 logging.level.com.example.demo.dao=debug .yml文件 # 打印sql logging: level: com.example.de ...