Java多线程:生产者消费者模式与等待唤醒机制实战解析
187 浏览量
更新于2024-09-01
收藏 81KB PDF 举报
"Java多线程之线程通信生产者消费者模式及等待唤醒机制代码详解"
在Java多线程编程中,生产者-消费者模式是一种经典的线程间通信方式,它描述了两个不同类型的线程——生产者线程和消费者线程如何协作处理共享资源。生产者负责生成数据,而消费者负责消费这些数据。在这个过程中,为了保证数据的一致性和避免线程间的竞态条件,需要使用同步机制。
在Java中,同步可以通过`synchronized`关键字实现。当一个方法被`synchronized`修饰时,它会获取到对象的监视器锁,确保同一时间只有一个线程可以执行该方法。在生产者-消费者模式中,生产者和消费者都会对共享资源(如队列)进行操作,因此需要使用同步来控制对资源的访问。
下面是一个简单的生产者-消费者模型的实现:
1. 首先,定义一个资源类`Resource`,包含资源名称和编号,以及生产资源和消费资源的方法。生产方法会增加资源编号并打印信息,消费方法则只是打印信息。
```java
class Resource {
private String productName;
private int count = 1;
public void produce(String name) {
this.productName = name + count;
count++;
System.out.println(Thread.currentThread().getName() + "生产者.." + this.productName);
}
public void consume() {
System.out.println(Thread.currentThread().getName() + "消费者.." + this.productName);
}
}
```
2. 接下来,创建生产者类`Producer`和消费者类`Consumer`,它们都实现`Runnable`接口,以便可以作为线程运行。
```java
class Producer implements Runnable {
private Resource res;
public Producer(Resource res) {
this.res = res;
}
@Override
public void run() {
// 生产逻辑
}
}
class Consumer implements Runnable {
private Resource res;
public Consumer(Resource res) {
this.res = res;
}
@Override
public void run() {
// 消费逻辑
}
}
```
3. 在主程序中,可以创建资源对象、生产者线程和消费者线程,并启动它们。为了实现生产者-消费者的协作,通常会使用阻塞队列,如`BlockingQueue`,它内置了同步机制,可以避免生产者过快生成数据导致消费者来不及消费,或者消费者过快消费导致生产者无数据可生产的情况。
```java
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class Main {
public static void main(String[] args) {
BlockingQueue<Resource> queue = new LinkedBlockingQueue<>(10); // 创建容量为10的阻塞队列
Thread producerThread = new Thread(new Producer(queue), "Producer");
Thread consumerThread = new Thread(new Consumer(queue), "Consumer");
producerThread.start();
consumerThread.start();
try {
producerThread.join();
consumerThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
```
在生产者线程的`run()`方法中,生产者将资源放入队列;在消费者线程的`run()`方法中,消费者从队列中取出资源并消费。`BlockingQueue`的`put()`和`take()`方法会自动实现阻塞,当队列满时,生产者会被阻塞直到有空间;当队列空时,消费者会被阻塞直到有可用资源。
此外,Java提供了`wait()`和`notify()`方法来实现更精细的等待唤醒机制。生产者在队列满时调用`wait()`让出CPU,消费者在队列空时调用`wait()`。当生产者发现队列有空间或消费者发现队列有资源时,它们可以调用`notify()`唤醒等待的线程。不过,这种方式需要在同步块(`synchronized`关键字)中使用,以确保线程安全。
Java的生产者-消费者模式通过同步和阻塞队列实现了线程间的高效协作,有效地解决了多线程环境下的数据共享和通信问题。在实际开发中,可以根据需求选择适合的同步策略,如`synchronized`、`wait/notify`或`BlockingQueue`等。
2009-04-21 上传
2020-08-25 上传
2007-10-01 上传
2011-09-16 上传
2020-08-31 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38740848
- 粉丝: 6
- 资源: 888
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库