Java多线程——生产者/消费者问题

简介: 生产者/消费者问题

经典例题:生产者/消费者问题

生产者(Productor)将产品交给店员(Clerk),而消费者(Customer)从店员处 取走产品,店员一次只能持有固定数量的产品(比如:20),如果生产者试图 生产更多的产品,店员会叫生产者停一下,如果店中有空位放产品了再通 知生产者继续生产;如果店中没有产品了,店员会告诉消费者等一下,如 果店中有产品了再通知消费者来取走产品。

分析:这里可能出现两个问题:

生产者比消费者快时,消费者会漏掉一些数据没有取到。

消费者比生产者快时,消费者会取相同的数据。

  1. 多线程问题,生产者线程、消费者线程
  2. 产品数量是共享数据
  3. 线程的安全
  4. 线程的通信

代码示例

Product.java

publicclassProduct {
//产品数量privateintproductNumber=0;
//生产产品publicsynchronizedvoidproduceProduct(){
if(productNumber<20){
productNumber++;
System.out.println(Thread.currentThread().getName()+"正在生产第"+productNumber+"个产品");
notify();
        }else{
try {
wait();
            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }
    }
//消费产品publicsynchronizedvoidconsumerProduct(){
if(productNumber>0){
System.out.println(Thread.currentThread().getName()+"正在消费第"+productNumber+"个产品");
productNumber--;
notify();
        }else{
try {
wait();
            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }
    }
}

Productor.java

publicclassProductorextendsThread{
privateProductproduct;
publicProductor(Productproduct){
this.product=product;
    }
@Overridepublicvoidrun() {
System.out.println(getName()+"生产产品.......");
while(true){
try {
Thread.sleep(100);
            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
product.produceProduct();
        }
    }
}

Consumer.java


publicclassConsumerextendsThread{
privateProductproduct;
publicConsumer(Productproduct) {
this.product=product;
    }
@Overridepublicvoidrun() {
System.out.println(currentThread().getName()+"消费产品.......");
while(true){
try {
Thread.sleep(100);
            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
product.consumerProduct();
        }
    }
}


Test.java

publicclassTest {
publicstaticvoidmain(String[] args) {
Productproduct=newProduct();
Productorproductor=newProductor(product);
productor.setName("生产者");
Consumerconsumer=newConsumer(product);
consumer.setName("消费者");
productor.start();
consumer.start();
    }
}

输出:

消费者消费产品…

生产者生产产品…

生产者正在生产第1个产品

生产者正在生产第2个产品

消费者正在消费第2个产品

生产者正在生产第2个产品

消费者正在消费第2个产品

生产者正在生产第2个产品

消费者正在消费第2个产品

消费者正在消费第1个产品

生产者正在生产第1个产品

消费者正在消费第1个产品

生产者正在生产第1个产品

消费者正在消费第1个产品

生产者正在生产第1个产品

生产者正在生产第2个产品

消费者正在消费第2个产品

生产者正在生产第2个产品

目录
相关文章
|
6月前
|
安全 算法 Java
Java 多线程:线程安全与同步控制的深度解析
本文介绍了 Java 多线程开发的关键技术,涵盖线程的创建与启动、线程安全问题及其解决方案,包括 synchronized 关键字、原子类和线程间通信机制。通过示例代码讲解了多线程编程中的常见问题与优化方法,帮助开发者提升程序性能与稳定性。
294 0
|
7月前
|
Java 数据挖掘 调度
Java 多线程创建零基础入门新手指南:从零开始全面学习多线程创建方法
本文从零基础角度出发,深入浅出地讲解Java多线程的创建方式。内容涵盖继承`Thread`类、实现`Runnable`接口、使用`Callable`和`Future`接口以及线程池的创建与管理等核心知识点。通过代码示例与应用场景分析,帮助读者理解每种方式的特点及适用场景,理论结合实践,轻松掌握Java多线程编程 essentials。
487 5
|
7月前
|
监控 搜索推荐 Java
Java 多线程最新实操技术与应用场景全解析:从基础到进阶
本文深入探讨了Java多线程的现代并发编程技术,涵盖Java 8+新特性,如CompletableFuture异步处理、Stream并行流操作,以及Reactive编程中的Reactor框架。通过具体代码示例,讲解了异步任务组合、并行流优化及响应式编程的核心概念(Flux与Mono)。同时对比了同步、CompletableFuture和Reactor三种实现方式的性能,并总结了最佳实践,帮助开发者构建高效、扩展性强的应用。资源地址:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
453 3
|
8月前
|
算法 Java 调度
Java多线程基础
本文主要讲解多线程相关知识,分为两部分。第一部分涵盖多线程概念(并发与并行、进程与线程)、Java程序运行原理(JVM启动多线程特性)、实现多线程的两种方式(继承Thread类与实现Runnable接口)及其区别。第二部分涉及线程同步(同步锁的应用场景与代码示例)及线程间通信(wait()与notify()方法的使用)。通过多个Demo代码实例,深入浅出地解析多线程的核心知识点,帮助读者掌握其实现与应用技巧。
150 1
|
8月前
|
Java
java 多线程异常处理
本文介绍了Java中ThreadGroup的异常处理机制,重点讲解UncaughtExceptionHandler的使用。通过示例代码展示了当线程的run()方法抛出未捕获异常时,JVM如何依次查找并调用线程的异常处理器、线程组的uncaughtException方法或默认异常处理器。文章还提供了具体代码和输出结果,帮助理解不同处理器的优先级与执行逻辑。
199 1
|
10月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
450 23
|
9月前
|
数据采集 存储 网络协议
Java HttpClient 多线程爬虫优化方案
Java HttpClient 多线程爬虫优化方案
|
3月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
190 6
|
6月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
334 83
|
3月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
362 0