生产消费者模型
基本概念:
生产消费者模型,就是存在两个线程,一个线程需要产生数据放入队列中,另一个对象需要取出数据,如果两者使用同一个缓冲区,同步处理的话,其效率就会大大减小,因为存在线程同步的问题需要处理。但是如果将生产者和消费者分开的话,生产者生产数据使用一个缓冲区,消费者使用数据用另一个缓冲区,若消费者的缓冲区中没有数据量,再把生产中的缓冲区的数据“倒”到消费者的缓冲区中,继续各自工作。如此,其效率便会大大提升。
线程同步:
要实现上述的功能,就要用到java中处理线程同步的一些类及方法。在使用这些方法之前需要了解JVM内部的结构。
如图所示:
虽然每个线程都会拥有以及创建一个属于自己的PC寄存器和JVM方法栈,但是方法区是被同一个JVM所有线程所共享的,因此两个线程同时调用相同方法时就会可能出错。
为了解决这个问题,我们就要用到java中锁的概念,若一个线程在调用这个方法时,,在该线程未使用完之前把这个方法锁起来。这时便用到关键字synchronized,代表这个方法加锁,相当于不管哪一个线程(例如生产者线程),运行到这个方法时,都要检查有没有其它线程正在用这个方法,有的话要等正在使用synchronized方法的线程运行完这个方法后再运行该生产者的线程,没有的话,就可以直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
如:public synchronized void producter(){…….方法体}
这样的话,将这整个方法都加上了一把“锁”,也就是说,一旦有一个线程在执行这个方法的时候就会将这整个方法都不能被其他线程所调用,虽然保险,然一般情况下会大大降低其线程的效率。因此,我们更多时候选择只将方法中其中一小部分易出现错误的地方锁住。
如:synchronized(syncObject) {
//允许访问控制的代码
}
这样就是将一个代码块放到里面,这块代码块在被执行时会被锁住。同时被使用的还有wait(),notify(),notifyAll().代码块可以调用wait()方法来将自身的操作挂起,直到同一个对象上的其他同步方法或同步代码块以某种方式将其改变,并调用notify()方法来通知此代码块改变已经完成。在加synchronized锁后才能调用wait(),notify(),和notifyAll().在wait()方法被调用后当前线程进入被加锁对象的线程休息室,然后释放锁,等待被唤醒。释放的锁由先前等待的另一个线程得到在获得锁后进行某种操作后通过notify或者notifyAll把原来线程从线程休息室唤醒,然后释放锁。原来被唤醒后,重新获取锁定,进行下一语句的执行。
有了上述的概念,我们就可以实现生产消费者模型。
双队列的主要代码:public class Tools {
public static list<Phone>lT = new list<Phone>(100000);
public static list<Phone>lP = new list<Phone>(100000);
}
public class DoubleBufferList {
private List<Object> IP;
private List<Object> IT;
private int gap;
/**
* 构造方法
*
* @param lP
* 用来存放对象的阻塞队列
* @param lT
* 用来取对象的阻塞队列
* @param gap
* 交换的间隔
*/
public DoubleBufferList(List IP, List IT, int gap) {
this.IP = IP;
this.IT = IT;
this.gap = gap;
}
public void check() {
Runnable runner = new Runnable() {
public void run() {
while (true) {
if (IT.size() == 0) {
synchronized (IT) {
synchronized (IP) {
IT.addAll(IP);
IP.notifyAll();
}
IP.clear();
}
}
}
}
};
Thread thread = new Thread(runner);
thread.start();
}
}
这样的双缓冲队列比一个队列的线程的效率是大大提高的。注意:
生产者队列在队列不满时进行生产
消费者队列大小为0的时候进行提取,并且进行等待
- 大小: 21.7 KB
分享到:
相关推荐
LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC语言实现生产者和消费者模型LinuxC...
在本文中,我们将深入探讨RocketMQ的生产者-消费者模型的实现。 一、消息队列概念 消息队列(Message Queue)是分布式系统中的重要组件,它作为数据缓冲区,允许生产者发送消息而不必立即等待消费者的响应。通过...
这是一个maven+springmvc+dubbo+zookeeper的模型包括生产者、消费者、接口等。其实现可参考https://blog.csdn.net/mijichui2153/article/details/81102277。
**Qt入门练习项目——生产者消费者模型** 在编程领域,生产者消费者模型是一种常见的多线程同步问题的解决方案。这个模型通常用于处理数据流的异步处理,其中一个或多个线程(生产者)生成数据,而其他线程(消费者...
Qt基于生产消费者模型异步访问数据库框架(不涉及数据库代码)
在计算机科学中,生产者-消费者模型是一种经典的并发编程问题,用于解决多个线程之间如何高效、安全地共享资源的问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。C++作为一门支持...
多线程实现生产者消费者模型:锁(Lock)、信号量(Semaphore、BoundedSemaphore)、条件(Condition)、队列(Queue)、事件(Event) 多进程程实现生产者消费者模型:信号量(Semaphore)、条件(Condition)、...
Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...
生产者消费者模型是一种多线程同步的经典设计模式,它源于操作系统中的进程通信概念,用于解决资源的高效利用和协同工作问题。在这个模型中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了确保生产...
在多线程编程中,设计模式是解决特定问题的有效手段,其中之一便是生产者-消费者模型。这个模型描述了两个或多个线程之间的协作,其中一方(生产者)生成数据,另一方(消费者)消费这些数据。在Qt框架下,我们可以...
在IT领域,生产者消费者模型是一种经典的并发编程模式,它源于操作系统理论,用于解决资源的高效利用和同步问题。在本案例中,该模型被应用于一个使用Qt框架开发的多进程环境中,使得生产者进程与消费者进程能有效地...
首先,我们要理解"生产者-消费者模型"的基本原理。在计算机科学中,这通常通过使用队列(Queue)数据结构实现。队列是一种先进先出(FIFO)的数据结构,生产者在队列的一端放入产品,消费者则在另一端取出产品。当...
### 消费者生产者模型 C++ #### 一、代码概览 此代码段实现了一个典型的消费者生产者模型,利用 C++ 和 Windows API 进行线程管理和同步控制。主要功能包括: - 定义了一个最大缓冲区数量 (`MAX_BUFFER_NUM`) 为 ...
生产者消费者模型是一种经典的线程同步问题,它模拟了实际生活中的生产过程和消费过程,使得生产者线程可以将数据生产出来,而消费者线程则负责消耗这些数据,两者之间通过共享数据结构进行协同工作。 生产者消费者...
通过这种方式,你可以在C#中实现高效、线程安全的生产消费者模型,提高程序的并发性能,避免无谓的循环轮询,让程序运行更加流畅。在实际开发中,可以根据具体需求调整队列容量、并发消费者数量等参数,以达到最佳的...
通过对生产者-消费者模型的实现,学生将学习如何在Linux环境下运用无名信号量来保护临界资源,同时提升对文件I/O操作的掌握。 二、实验内容 实验分为三个部分: 1. 使用链式结构创建10个子进程,形成进程链。 2. ...
在生产者-消费者模型中,可以设置一个信号量来控制队列的满和空状态,限制生产者的生产速率和消费者的消费速率。 7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、...
生产者,消费者,线程同步,模型,锁
内容:编程实现生产者-消费者问题的模拟。 基本要求: 1. 生产者消费者对缓冲区进行互斥操作。 2. 缓冲区大小为10,缓冲区满则不允许生产者生产数据,缓冲区空则不允许消费者消费数据。 3. 生产者消费者各循环操作10...
基于Linux C++的条件变量实现的生产者消费者模型,旨在进一步帮助读者理解条件变量的使用。