网上有很多生产者消费者模型,很多都是基于synchronized, wait, notify的,也有基于Lock的,下面是我用Lock, Condition实现的.
1 仓库:
class GodOwn { //声明锁对象 private Lock lock = new ReentrantLock(); //当仓库中的物品数量不够消费的条件 Condition lessCondition = lock.newCondition(); //当仓库中的物品数量超过仓库的总量的条件 Condition moreCondition = lock.newCondition(); private final int max_size = 50; private int baseNum = 0; int getMax_size() { return max_size; } int getBaseNum() { return baseNum; } void setBaseNum(int baseNum) { this.baseNum = baseNum; } public void produce (int neednum) { lock.lock(); try { while (this.getBaseNum() + neednum > this.getMax_size()) {//超过总量不生产 try { moreCondition.await();//超过仓库总量时,生产线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setBaseNum(this.getBaseNum() + neednum); System.out.println("生产了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!"); moreCondition.signalAll();//本轮生产完毕,唤醒对象上所有的线程,看是否需要生产还是消费 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock();//释放锁,这一步很重要,最好在finally语句块里执行,防止程序异常,锁永远无法释放 } } public void reduce(int neednum) { lock.lock(); try { while (this.getBaseNum() - neednum < 0) { try { lessCondition.await();//仓库总量不够本次消费数量时,消费线程等待 } catch (InterruptedException e) { e.printStackTrace(); } } this.setBaseNum(this.getBaseNum() - neednum); System.out.println("消费了" + neednum + "个,仓库共有" + this.getBaseNum() + "个!"); lessCondition.signalAll();//本轮消费完毕,唤醒对象上所有的线程,看是否需要生产还是消费 } catch (Exception e) { e.printStackTrace(); } finally { lock.unlock();//释放锁 } } }
2 生产者模型
class ProduceThread extends Thread { private GodOwn godOwn; private int neednum; ProduceThread(GodOwn godOwn, int neednum) { this.godOwn = godOwn; this.neednum = neednum; } public void run() { godOwn.produce(neednum); } }
3 消费者模型
class ResuseThread extends Thread { private GodOwn godOwn; private int neednum; ResuseThread(GodOwn godOwn, int neednum) { this.godOwn = godOwn; this.neednum = neednum; } public void run () { this.godOwn.reduce(neednum); } }
4 测试代码
public static void main(String[] args) { GodOwn godOwn = new GodOwn(); ProduceThread p1 = new ProduceThread(godOwn, 50); ProduceThread p2 = new ProduceThread(godOwn, 30); ProduceThread p3 = new ProduceThread(godOwn, 20); ProduceThread p4 = new ProduceThread(godOwn, 20); ProduceThread p5 = new ProduceThread(godOwn, 20); ResuseThread r1 = new ResuseThread(godOwn, 20); ResuseThread r2 = new ResuseThread(godOwn, 20); ResuseThread r3 = new ResuseThread(godOwn, 20); p1.start(); p2.start(); p3.start(); p4.start(); p5.start(); r1.start(); r2.start(); r3.start(); }
运行结果:
生产了50个,仓库共有50个! 消费了20个,仓库共有30个! 生产了20个,仓库共有50个! 消费了20个,仓库共有30个! 消费了20个,仓库共有10个! 生产了20个,仓库共有30个! 生产了20个,仓库共有50个!
以上只是一个简单的例子,为了说明Lock Condition的用处!
相关推荐
在这个场景中,"生产者-消费者(lock和condition).zip"的文件内容可能包含一个使用Java语言实现的示例,它利用了`java.util.concurrent.locks.Lock`接口和`Condition`接口来解决这个问题。 `Lock`接口是Java并发库...
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
这个C++实现的生产者消费者问题展示了线程间通信和同步的基本方法,它是多线程编程中的重要知识点,对于理解和解决复杂并发问题有着重要意义。通过深入学习和实践,我们可以更好地掌握多线程编程,并在实际项目中...
在多线程环境中,生产者消费者模型和读者写者问题是经典的并发控制问题,它们都涉及到资源共享与同步。本主题将深入探讨如何使用编程来解决这两个问题。 首先,生产者消费者问题是多线程并发控制中的一个经典例子。...
4. **信号量**:除了Lock之外,生产者-消费者问题常常会用到Condition来协调生产者和消费者的动作。Condition可以创建多个等待队列,允许线程按照特定条件进行等待和唤醒。例如,生产者可能需要等待缓冲区有空位,而...
这个示例展示了如何使用`Lock`和`Condition`来实现生产者消费者模式的基本逻辑。`Lock`接口相比`synchronized`关键字的优势在于它可以更灵活地控制锁的获取和释放,以及条件的等待和唤醒。此外,`Condition`接口可以...
生产者和消费者线程都需要有自己的业务逻辑,这可以通过重写`run()`方法实现。 2. **共享资源**:在生产者-消费者模型中,通常会有一个固定大小的缓冲区作为共享资源。可以使用数组或链表实现,但需要注意的是,当...
以下是简化版的生产者和消费者线程实现: ```cpp void producer(int id) { while (true) { std::unique_lock<std::mutex> lock(mtx); cv.wait(lock, [] { return !empty; }); // 等待缓冲区非空 // 创建数据并...
3. **生产者-消费者模型的实现** - **队列**:生产者和消费者之间通常会用到一个共享的缓冲区,也就是队列,用来存储生产者产生的数据供消费者消费。C++中可以使用`std::queue`容器来实现。 - **生产者**:生产者...
本示例中,我们使用了Lock和Condition来实现生产者消费者模型,避免了使用synchronized关键字的方式,而是使用了Lock和Condition来实现线程同步和通信,提高了程序的性能和可读性。 知识点: * Java中的生产者消费...
2. **BlockingQueue(阻塞队列)**:在实际的生产者消费者实现中,通常会使用`java.util.concurrent`包下的`BlockingQueue`接口。它提供了一种线程安全的数据结构,可以作为生产者和消费者的交界面。生产者将数据放...
在Java或C++等编程语言中,我们可以利用多线程来实现“生产者消费者”模式,这是一个经典的并发问题。这个模式涉及到两个主要角色:生产者(Producer)和消费者(Consumer),它们共享一个有限大小的缓冲区作为临界...
生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发...这个简单的C++实现展示了生产者消费者问题的基本解决方案,但在实际应用中,可能需要考虑更复杂的情况,如线程优先级、超时机制以及异常处理等。
本篇将深入探讨如何使用C++的STL库以及线程库来实现多方程解决生产者-消费者问题。 首先,理解问题的基本结构至关重要。假设有一个缓冲区,生产者往里面添加产品,消费者从中取出产品。我们需要确保在任何时候,...
为防止生产者过快填充缓冲区或消费者过快清空缓冲区,我们需要引入同步机制,如互斥量(mutex)和条件变量(condition variable),来控制生产者和消费者的操作顺序。 在VC++中,我们可以使用`std::mutex`来实现...
本文将深入探讨C++中的多线程通信方式,并结合经典的生产者-消费者模式来阐述其实现。 一、C++多线程基础 C++11引入了标准库`<thread>`,提供了对多线程的支持。创建线程的基本方法是通过`std::thread`类,如下所示...
在Java中,`java.util.concurrent`包提供了多种实现生产者消费者模型的工具,如`BlockingQueue`。 `BlockingQueue`是Java并发编程的一个核心接口,它实现了队列的数据结构,并且具备线程安全的特性。生产者可以将...
在计算机系统设计中,...这个简单的模型可以扩展到多个生产者和消费者,通过适当调整信号量和互斥锁的使用,可以实现更复杂的需求。在实际应用中,还需要考虑错误处理和资源释放等问题,以保证程序的健壮性和稳定性。
生产者-消费者问题是多线程编程中的一个经典同步问题,主要涉及进程间的协作与通信。在操作系统领域,这个问题常被用来演示如何有效地管理和控制资源的使用。本实验使用Pthread库来解决这个问题,Pthread是POSIX线程...
在生产者与消费者问题中,通常使用`synchronized`或者`Lock`配合`Condition`来控制线程的执行顺序和资源访问。 3. **synchronized关键字**:可以用于方法或者代码块,用于实现互斥访问。在生产者与消费者问题中,当...