package function.thread;
import java.util.Vector;
public class MultiProConsumTest {
public static void main(String args[]) {
Vector obj = new Vector();
Thread consumer1 = new Thread(new MultiConsumer(obj));
Thread consumer2 = new Thread(new MultiConsumer(obj));
Thread consumer3 = new Thread(new MultiConsumer(obj));
Thread producter1 = new Thread(new MultiProducter(obj));
Thread producter2 = new Thread(new MultiProducter(obj));
Thread producter3 = new Thread(new MultiProducter(obj));
consumer1.start();
consumer2.start();
consumer3.start();
producter1.start();
producter2.start();
producter3.start();
}
}
/* 消费者 extends不能写在implements后面 */
class MultiConsumer extends MultiShareInfo implements Runnable {
public MultiConsumer(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
System.out.println("******Consumer:【"+Thread.currentThread().getName()+"】 get a lock *****");
String str = "";
try {
if (obj.size() == 0) {
System.out.println("******Consumer:【"+Thread.currentThread().getName()+"】 wait begin *****");
obj.wait();//醒来之后会执行接下去的语句,此时已经没有了锁
}
System.out.println("******Consumer:【"+Thread.currentThread().getName()+"】wake up and get obj size: " + obj.size());
//wait被唤醒之后,就独占锁继续执行
if(obj.size() == 0){
System.out.println("******Consumer:【"+Thread.currentThread().getName()+"】still hold the lock********");
for(int i=0;i<50;i++){
Thread.sleep(100);
System.out.print(".");
}
System.out.println();
}else{
str = (String)obj.get(obj.size()-1);
obj.remove(obj.size()-1);
System.out.println("******Consumer:【"+Thread.currentThread().getName()+"】 get 【"+str+"】");
obj.notifyAll();//唤醒了所有等待obj的线程,包括生成者和消费者线程
}
} catch (Exception e) {
e.printStackTrace();
}
}//synchronize block
}
}
/* 生产者 */
class MultiProducter extends MultiShareInfo implements Runnable {
public MultiProducter(Vector v) {
this.obj = v;
}
public void run() {
synchronized (obj) {
System.out.println("******Producter:【"+Thread.currentThread().getName()+"】 get a lock *****");
int size = obj.size();
try {
if (obj.size() >=10) {
obj.wait();
}
obj.add(new String("apples"+(size+1)));
System.out.println("******Producter:【"+Thread.currentThread().getName()+"】 put an apple,next notify&sleep 500 ms");
obj.notifyAll();
Thread.sleep(500);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
class MultiShareInfo{
public Vector obj;
}
运行结果:
******Consumer:【Thread-0】 get a lock *****
******Consumer:【Thread-0】 wait begin *****
******Consumer:【Thread-2】 get a lock *****
******Consumer:【Thread-2】 wait begin *****
******Consumer:【Thread-1】 get a lock *****
******Consumer:【Thread-1】 wait begin *****
******Producter:【Thread-4】 get a lock *****
******Producter:【Thread-4】 put an apple,next notify&sleep 500 ms
******Producter:【Thread-5】 get a lock *****
******Producter:【Thread-5】 put an apple,next notify&sleep 500 ms
******Consumer:【Thread-1】wake up and get obj size: 2
******Consumer:【Thread-1】 get 【apples2】
******Consumer:【Thread-2】wake up and get obj size: 1
******Consumer:【Thread-2】 get 【apples1】
******Consumer:【Thread-0】wake up and get obj size: 0
******Consumer:【Thread-0】still hold the lock********
..................................................
******Producter:【Thread-3】 get a lock *****
******Producter:【Thread-3】 put an apple,next notify&sleep 500 ms
相关推荐
在本项目中,我们主要探讨的是如何利用SpringBoot、Dubbo和Zookeeper来构建一个具有多个生产者和消费者的分布式服务系统,并实现负载均衡。以下是详细的知识点解释: 1. **SpringBoot**: SpringBoot是Spring框架...
同步互斥中的生产者和消费者问题,多缓冲区生产者消费者
1. **多生产者**:系统中有多个生产者线程,每个线程可以独立地生成产品。为了防止冲突,生产者之间需要同步,确保它们不会同时向队列中添加产品,导致数据不一致。 2. **多消费者**:同样,系统中也有多个消费者...
在计算机科学和编程领域,"多个生产者和消费者问题"是一个经典的并发控制问题,它涉及到多线程或进程之间的同步。在Windows环境下,VC(Visual C++)是常用的开发工具,可以用来解决这类问题。本篇文章将深入探讨...
信号量可以控制对共享资源的访问,确保任何时候只有一个生产者或消费者在操作队列。我们还需要使用`CreateMutex`函数创建互斥量,确保在读写队列时的独占性。 队列的实现可以采用循环数组,这样可以高效地管理空间...
一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。一个消费者只消费小写字符,一个消费者只消费大写字母,而另一...
5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 ...
### 多个生产者消费者问题 #### 知识点概览 1. **生产者-消费者模式** 2. **多线程同步机制** 3. **Java中的线程控制** 4. **Vector类与同步** 5. **异常处理** #### 生产者-消费者模式 在计算机科学中,“生产者-...
3. **共享缓冲区操作**:多个生产者或多个消费者之间需要有共享对缓冲区进行操作的函数代码。 #### 三、实现原理与代码解析 本节将详细介绍如何使用C++语言中的多进程同步机制来实现上述功能。 #### 1. 基础数据...
1.dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子 2. ssm-dubbo 源码 ssm-tomcat 里放的是 warbao ,程序包 zookeeper-3.4.9 zookeeper 免安装包 设置都是默认的 zookeeper 端口 2181 dubbo-...
假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环...当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥
在这个`Warehouse`类中,`produce()`和`consume()`方法都是`synchronized`的,确保同一时间只有一个生产者或消费者可以执行。如果仓库已满,生产者会调用`wait()`进入等待状态,直到其他线程调用`notifyAll()`唤醒...
在Linux操作系统中,多进程生产者-消费者模型是一种常见的并发编程模式,用于处理多个进程间的协同工作,特别是在数据处理和I/O操作中。这个模型基于一个核心概念:生产者进程生成数据,而消费者进程消耗这些数据。...
在Qt框架下,我们可以利用其强大的信号(Signals)和槽(Slots)机制,结合信号量(Semaphores)来实现单生产者多消费者模型,以确保线程间的同步和数据的安全传输。 首先,理解Qt的信号和槽机制是关键。信号...
6. **启动线程**:创建多个生产者和消费者线程,然后启动它们,线程会按照规则交替执行,实现生产与消费的平衡。 在提供的文件"stack"中,可能包含了一个使用栈作为缓冲区的生产者消费者模式实现。栈具有后进先出...
在计算机科学中,生产者-消费者问题是多线程编程中一个经典的同步问题。它涉及到两个主要角色:生产者和消费者。生产者负责生成数据,而消费者则负责消费这些数据。在C++中,我们通常使用互斥量(mutexes)、条件...
在实际应用中,生产者-消费者模型可以被扩展到多个生产者和多个消费者,且缓冲区大小可以动态调整。此外,为了防止死锁和饥饿现象,还需要考虑适当的同步策略,如公平性和优先级反转的处理。 总之,"生产者-消费者...
生产者和消费者模式具有很好的扩展性,不仅可以有一个生产者和一个消费者,也可以有多个。这种模式适用于多个线程之间需要协作处理数据的情况,如消息队列、数据库缓存更新等场景。 8. **示例代码:** 创建一个...