首页 > 其他分享 >wait-notify代码(生产者-消费者问题)

wait-notify代码(生产者-消费者问题)

时间:2024-11-02 11:46:16浏览次数:3  
标签:Thread 生产者 lock notify 缓冲区 wait

生产者-消费者问题是经典的多线程同步问题,可以使用Java中的wait()notify()方法来解决。以下是一个简单的示例代码,展示了如何使用这些方法来处理生产者-消费者问题。

在这个示例中,我们有一个共享的缓冲区(队列),生产者生产数据并将其放入缓冲区,消费者从缓冲区中取出数据进行处理。我们使用wait()notify()来确保生产者和消费者之间的正确同步。

import java.util.LinkedList;
import java.util.Queue;
class ProducerConsumer {
private final Queue<Integer> buffer = new LinkedList<>();
private final int BUFFER_SIZE = 5;
private final Object lock = new Object();
// 生产者线程
class Producer implements Runnable {
@Override
public void run() {
int item = 0;
while (true) {
synchronized (lock) {
while (buffer.size() == BUFFER_SIZE) {
try {
System.out.println("Buffer is full. Producer is waiting.");
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
buffer.add(item);
System.out.println("Produced: " + item);
item++;
lock.notify();
try {
Thread.sleep(100); // 模拟生产时间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
}
// 消费者线程
class Consumer implements Runnable {
@Override
public void run() {
while (true) {
synchronized (lock) {
while (buffer.isEmpty()) {
try {
System.out.println("Buffer is empty. Consumer is waiting.");
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
int item = buffer.poll();
System.out.println("Consumed: " + item);
lock.notify();
try {
Thread.sleep(150); // 模拟消费时间
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
return;
}
}
}
}
}
public static void main(String[] args) {
ProducerConsumer pc = new ProducerConsumer();
Thread producerThread = new Thread(pc.new Producer());
Thread consumerThread = new Thread(pc.new Consumer());
producerThread.start();
consumerThread.start();
}
}

代码解释

  1. 共享缓冲区:使用一个LinkedList作为缓冲区,并设定一个固定的缓冲区大小BUFFER_SIZE
  2. 锁对象:使用一个Object类型的lock对象来进行同步。
  3. 生产者线程
    • 在一个无限循环中,生产者会检查缓冲区是否已满。
    • 如果缓冲区已满,生产者调用lock.wait()来等待,直到被消费者通知。
    • 如果缓冲区未满,生产者将生产的项目添加到缓冲区中,并调用lock.notify()来通知可能等待的消费者。
  4. 消费者线程
    • 在一个无限循环中,消费者会检查缓冲区是否为空。
    • 如果缓冲区为空,消费者调用lock.wait()来等待,直到被生产者通知。
    • 如果缓冲区不为空,消费者从缓冲区中取出项目进行处理,并调用lock.notify()来通知可能等待的生产者。
  5. 主方法:创建并启动生产者和消费者线程。

这个示例展示了如何使用wait()notify()来协调生产者和消费者线程之间的操作,从而避免竞争条件和死锁。

标签:Thread,生产者,lock,notify,缓冲区,wait
From: https://blog.csdn.net/Good_tea_h/article/details/143448629

相关文章

  • 《Linux系统编程篇》fork/wait/waitpid/exit函数——基础篇
    文章目录引言fork()函数概述父子进程兄弟进程fork函数fork()的常见问题fork()的优势与限制引入`wait`和`waitpid`(解决僵尸进程)wait函数waitpid函数:exit函数结论命为志存。——朱熹引言《Linux系统编程篇》——基础篇首页传送门本节我们正式进入Linux的进......
  • 生产者消费者模型
         线程同步互斥锁(互斥量)条件变量生产/消费者模型一、互斥锁C++11提供了四种互斥锁:mutex:互斥锁。timed_mutex:带超时机制的互斥锁。recursive_mutex:递归互斥锁。recursive_timed_mutex:带超时机制的递归互斥锁。包含头文件:#include<mutex>1、mutex类1)加锁lock()......
  • 深入解析C#异步编程:await 关键字背后的实现原理
    C#异步编程中await实现原理详解在C#中,async和await关键字用于编写异步代码。本文将详细介绍await的实现原理,包括状态机的生成、回调函数的注册和触发等关键步骤。1.异步方法的基本概念在C#中,async关键字标记一个方法为异步方法,而await关键字用于等待一个异步操作完......
  • rsync和inotify-tools实现文件实时同步
    rsync和inotify-tools实现文件实时同步一、环境准备服务器设置确定一台源服务器(假设为ServerA)和多台目标服务器(假设为ServerB、ServerC等),确保它们之间网络连通,并且能够互相通过SSH访问。在每台服务器上安装inotify-tools和rsync软件包。在CentOS系统中,可......
  • QwaitCondition.的工作原理
    背景:之前只知道个QWaitCondition用于同步不同的线程运行状态。但不知道为何这样做。为什么还要在QWaitcondition.wai()中还要传入一个QMutext变量的指针。QWaitCondition.wait的工作原理:QWaitCondition.wait的工作原理:伪代码Qmutexmutex;QwaitConditioncon......
  • 前端JavaScript的异步编程:从回调到Promise再到Async/Await
    写在前面在前端开发中,异步编程是一个非常重要的概念。随着JavaScript语言和前端技术的发展,异步编程的模式也在不断演进。本文将带你了解从最初的回调函数(Callback)到Promise,再到现代的Async/Await,这些异步编程模式的演变过程。回调函数(Callback)回调函数是最早期的异步编程......
  • Kafka 的生产者
    Kafka的生产者1.生产者的执行流程生产者客户端由两个线程协调运行,这两个线程分别为主线程和Sender线程(发送线程),其中,在主线程中由KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到消息累加器(RecordAccumulator,也称消息收集器)中。Sender线......
  • 生产者消费者模型
     线程同步互斥锁(互斥量)条件变量生产/消费者模型一、互斥锁C++11提供了四种互斥锁:mutex:互斥锁。timed_mutex:带超时机制的互斥锁。recursive_mutex:递归互斥锁。recursive_timed_mutex:带超时机制的递归互斥锁。包含头文件:#include<mutex>1、mutex类1)加锁lock()互斥锁......
  • TCP连接状态是TIME_WAIT的场景解析
    在Tomcat处理网络请求时,TIME_WAIT状态通常是TCP连接关闭过程中的一个阶段。这个状态主要与TCP的四次挥手(Four-WayHandshake)有关。以下是在Tomcat处理网络请求时,连接状态变为TIME_WAIT的具体情况:四次挥手过程1.客户端发送FIN包:客户端完成数据传输后,主动调用clos......
  • 【Linux线程】Linux多线程实践:深入生产者消费者模型
    ......