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
;
}
相关推荐
通过上述介绍,我们不仅了解了其基本概念、常见类型及使用场景,还掌握了核心方法的使用方法。掌握`BlockingQueue`不仅能帮助我们更高效地进行多线程编程,还能在实际工作中更好地应对各种并发挑战。
**基于Java中的BlockingQueue使用介绍** Java的并发编程框架提供了多种高级并发工具,其中BlockingQueue是一种非常实用的数据结构,它实现了生产者-消费者模式。在多线程环境下,BlockingQueue可以高效地处理线程间...
阻塞队列(BlockingQueue)是一种特殊的队列,它支持两个附加操作:阻塞的插入方法put和阻塞的移除方法take。BlockingQueue继承了Queue接口,是Java 5中加入的。 BlockingQueue常用方法示例: 1. add(E e):添加一...
本文简要介绍下BlockingQueue接口中几个方法的作用及区别。 boolean add(E e) (1)在不违反容量限制的情况下,可立即将指定元素插入此队列,成功返回true。 (2)当无可用空间时候,抛出IllegalStateException异常 ...
本文将详细介绍BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 BlockingQueue的特点是可以阻塞线程,使得生产者线程和消费者线程之间的数据共享变得简单高效。它可以自动阻塞生产者线程...
基于JavaDisruptor的并发编程深度学习项目 ... 进行压力测试与JDK的BlockingQueue进行性能对比。 无锁并行计算框架核心 学习Disruptor的基础使用与API。 介绍内部各种组件的原理和运行机制。
介绍无锁并行计算框架Disruptor,并进行压力测试与JDK的BlockingQueue进行性能对比。 2. 无锁并行计算框架核心 学习无锁并行计算框架的基础使用与API。 介绍内部各种组件的原理和运行机制。 3. 无锁并行计算...
6. `谷度科技_客户关系及资源管理系统_CRM.xls`文件可能是介绍如何在CRM系统中应用生产者消费者模式的案例,可能包含了系统的架构设计、性能分析等信息。 在实际开发中,生产者消费者模式有助于提高系统并发性,...
#### 一、背景介绍 在开发多线程应用时,线程安全成为至关重要的考量因素之一。特别是在需要处理并发任务时,如何确保线程之间的安全通信变得尤为重要。本篇文章将围绕一个具体的场景——项目中的巡检任务管理——...
下面将详细介绍这一模式及其在Java中的实现。 生产者-消费者模型的核心是共享资源,通常是某种缓冲区或队列,生产者将产品放入这个共享空间,而消费者则从中取出产品进行消费。为了解决线程间的同步和互斥问题,...
1. **阻塞队列接口**:首先,会介绍`BlockingQueue`接口,它的核心方法如`put()`用于生产者插入元素,`take()`用于消费者取出元素,这些方法会自动处理线程的阻塞和唤醒。 2. **队列实现**:接着可能会讲解几种具体...
这一接口扩展了`BlockingQueue`接口的功能,为线程之间的通信提供了更灵活的选择。此外,`LinkedTransferQueue`类实现了`TransferQueue`接口,提供了一种高效且灵活的数据传输机制。 ##### 3.4 客户端JRE性能提升 ...
`TransferQueue`接口是对`BlockingQueue`接口的一种扩展,它支持生产者等待消费者接收元素。这种机制非常适合用于处理异步数据传输场景。 ##### 2. LinkedTransferQueue 实现 `LinkedTransferQueue`是一种高性能、...
最后,探讨了线程间通信的方法,包括wait()、notify()、notifyAll()以及 BlockingQueue 的使用。通过丰富的代码示例,帮助读者理解和掌握Java多线程编程。 适合人群:具备基本Java编程知识,希望深入了解多线程编程...
BlockingQueue Executors ForkJoinPool ii. 事务隔离级别和传播特性 iii. mysql 索引 b+树和二叉树区别,聚簇索引() redis 使用场景 分布式锁使用过的命令 session 服务实现 原理使用 ZooKeeper 介绍TCP/IP协议 介绍...
标题“多线程编程之一 介绍+例程”暗示我们将从基础出发,逐步揭示多线程编程的核心原理,并通过实际的代码示例来辅助理解。 首先,我们需要了解什么是多线程编程。在单线程环境中,程序按照顺序执行任务。而在多...
Java5的多线程新特性与API介绍 Java5对多线程的支持进行了重大升级,引入了一系列的新特性和API,极大地改善了多线程编程的效率、灵活性和安全性。以下是根据给定文件信息中提到的关键知识点进行的详细介绍: ### ...
本资料包"多线程介绍.zip"提供了多线程场景的实例源码和相关的说明文档,旨在帮助开发者深入理解并熟练运用多线程技术。 1. **线程的概念** 线程是操作系统调度的基本单位,它共享进程的内存空间,有自己的程序...
在文件的【部分内容】中,首先介绍了数组和集合的区别。数组是一种基础的数据结构,它可以存储相同类型的元素,并且一旦初始化,长度就无法改变。而集合是存储对象数据的容器,它的优势在于可以存储任意类型的对象,...
下面将详细介绍如何使用Java实现生产者消费者模型,并探讨其核心概念与技术。 生产者消费者模型的基本思想是:一组生产者线程负责生成数据,一组消费者线程负责消费这些数据,两者之间通过共享数据结构(如队列)...