import
java.util.Random;
import
java.util.concurrent.BlockingQueue;
import
java.util.concurrent.TimeUnit;
/**
*
消费者线程
*
*
@author jackyuj
*/
public
class
Consumer
implements
Runnable
{
public
Consumer(BlockingQueue<String>
queue) {
this
.queue
= queue;
}
public
void
run()
{
System.out.println(
"启动消费者线程!"
);
Random
r =
new
Random();
boolean
isRunning
=
true
;
try
{
while
(isRunning)
{
System.out.println(
"正从队列获取数据..."
);
String
data = queue.poll(
2
,
TimeUnit.SECONDS);
if
(
null
!=
data) {
System.out.println(
"拿到数据:"
+
data);
System.out.println(
"正在消费数据:"
+
data);
Thread.sleep(r.nextInt(DEFAULT_RANGE_FOR_SLEEP));
}
else
{
isRunning
=
false
;
}
}
}
catch
(InterruptedException
e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
finally
{
System.out.println(
"退出消费者线程!"
);
}
}
private
BlockingQueue<String>
queue;
private
static
final
int
DEFAULT_RANGE_FOR_SLEEP
=
1000
;
}
import
java.util.Random;
import
java.util.concurrent.BlockingQueue;
import
java.util.concurrent.TimeUnit;
import
java.util.concurrent.atomic.AtomicInteger;
/**
*
生产者线程
*
*
@author jackyuj
*/
public
class
Producer
implements
Runnable
{
public
Producer(BlockingQueue
queue) {
this
.queue
= queue;
}
public
void
run()
{
String
data =
null
;
Random
r =
new
Random();
System.out.println(
"启动生产者线程!"
);
try
{
while
(isRunning)
{
System.out.println(
"正在生产数据..."
);
Thread.sleep(r.nextInt(DEFAULT_RANGE_FOR_SLEEP));
data
=
"data:"
+
count.incrementAndGet();
System.out.println(
"将数据:"
+
data +
"放入队列..."
);
if
(!queue.offer(data,
2
,
TimeUnit.SECONDS)) {
System.out.println(
"放入数据失败:"
+
data);
}
}
}
catch
(InterruptedException
e) {
e.printStackTrace();
Thread.currentThread().interrupt();
}
finally
{
System.out.println(
"退出生产者线程!"
);
}
}
public
void
stop()
{
isRunning
=
false
;
}
private
volatile
boolean
isRunning
=
true
;
private
BlockingQueue
queue;
private
static
AtomicInteger
count =
new
AtomicInteger();
private
static
final
int
DEFAULT_RANGE_FOR_SLEEP
=
1000
;
}
相关推荐
Java 多线程与并发(16_26)-JUC集合_ BlockingQueue详解
java中线程队列BlockingQueue的用法
绍Java多线程(五)之BlockingQueue深入分析
今天小编就为大家分享一篇关于Java多线程工具篇BlockingQueue的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
主要介绍了Java多线程Queue、BlockingQueue和使用BlockingQueue实现生产消费者模型方法解析,涉及queue,BlockingQueue等有关内容,具有一定参考价值,需要的朋友可以参考。
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。 线程 一. 线程池 1)为什么要使用线程池 2 2)一个具有线程池的工作队列 3 3)使用线程池的风险: 4 4)有效使用线程池的原则 5...
主要介绍了Java多线程 BlockingQueue实现生产者消费者模型详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...
【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...
Java开发基于多线程和NIO实现聊天室源码+项目说明(含服务端+客户端).zip 涉及到的技术点 - 线程池ThreadPoolExecutor - 阻塞队列BlockingQueue,生产者消费者模式 - Selector - Channel - ByteBuffer - ...
三、:locked_with_key:Java多线程与并发框架:unlocked: Java多线程与并发框 (第 13 篇) 深入理解:Fork/Join框架 Java多线程与并发框 (第 14 篇) 深入理解:原子操作 Java多线程与并发框 (第 15 篇) 深入理解...
JAVA线程基本学习, JAVA多线程的特性= 线程池: 本质上是一个对象池, 用来管理线程资源. 在任务执行前, 需要从线程池中拿出线程来执行. 在任务执行完成之后, 需要把线程放回线程池. 线程池好处: 降低资源的消耗...
数据库工具类,提供了关闭方法:关闭可以传入多个参数,关闭的顺序是按照参数的顺序来的,用于一次性关闭Connnection、Statement、ResultSet等 newSqlRunner方法用于快速新建一个SqlRunner(此类介绍参考下问) 3、...
阻塞队列BlockingQueue,生产者消费者模式 选择器 渠道 字节缓冲区 ProtoStuff 高性能序列化 HttpClient连接池 Spring依赖注入 lombok简化POJO开发 原子指标 内置锁 竣工服务 log4j+slf4j日志 实现的功能 登录注销 ...
多线程基础 synchronized volatile 线程间的通信 锁(重入锁,读写锁) 并发工具 增强的Future CompletableFuture 线程池技术 Java线程池Executors ForkJoin框架 原子操作类 JVM 虚拟机结构 class 文件格式 Class...
5.将生命游戏由单线程模式改为多线程模式,使用n个线程并行读取初始pgm文件,把图像分割为n份,分别计算出下一轮的细胞状态,然后重新整合为一个新一代细胞状态图。要求程序无死锁(Deadlock Free),无竞争条件(No...
多线程与并发 Spring SpringMVC SpringBoot Mybatis 数据结构与算法 入门基础 基础数据结构 数组&链表 数组&链表进阶 栈 队列 算法思想 数论&枚举&递归&分治&回溯 排序及其源码实现 贪心&动态规划 高级数据结构 树论...
Java基于多线程和NIO实现聊天室涉及到的技术点线程池ThreadPoolExecutor阻塞队列BlockingQueue,生产者消费者模式SelectorChannelByteBufferProtoStuff 高性能序列化HttpClient连接池Spring依赖注入lombok简化POJO...
1.2.1 发挥多处理器的强大能力 1.2.2 建模的简单性 1.2.3 异步事件的简化处理 1.2.4 响应更灵敏的用户界面 1.3 线程带来的风险 1.3.1 安全性问题 1.3.2 活跃性问题 1.3.3 性能问题 1.4 线程无处不在 第一...