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,通过maven分模块实现基础接口、生产者、消费者,连接本地安装的zookeeper实现负载均衡
同步互斥中的生产者和消费者问题,多缓冲区生产者消费者
可设多个生产者和消费者,还有产品和缓冲区
一个生产者进程试图不断地在一个缓冲中写入大写字母,另一个生产者进程试图不断地在缓冲中写入小写字母。3个消费者不断地从缓冲中读取一个字符并输出。一个消费者只消费小写字符,一个消费者只消费大写字母,而另一...
5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 ...
多个生产者消费者,可以分别设定生产者各生产多少个产品,产品id自增长,name随机,prince随机。放到队列,多个消费者取队列里的产品,直到队列里产品全部取出,按产品属性排序输出。
本程序用来解决多个生产者消费者问题 对线程的调用进行了深入的分析
1.dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子 2. ssm-dubbo 源码 ssm-tomcat 里放的是 warbao ,程序包 zookeeper-3.4.9 zookeeper 免安装包 设置都是默认的 zookeeper 端口 2181 dubbo-...
java 课程设计 生产者消费者图形界面模拟 swing模拟单个生产者单个消费者 多个生产者多个消费者
假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环...当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥
问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者...
在生产者---消费者问题中应注意(信号量名称以多个生产者和多个消费者中的为例):首先,在每个程序中用于互斥的wait(mutex)和signal(mutex)必须成对出现;其次,对资源信号量empty和full的wait和signal操作,同样...
一个消费者生产者问题linux的实现,是我们操作系统的小作业
用多进程同步方法解决生产者—消费者问题(c++源码) 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针...3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。
C++ windows版 多生产者多消费者的队列实现
设计在同一个进程地址空间内执行的多个线程。生产者线程和消费者线程。生产者线程生产物品,然后将物品放置在一个空缓冲区中供消费者线程消费。消费者线程从缓冲区中获得物品,然后释放缓冲区。生产者线程生产物品时...
多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 采用...
生产者消费者流程图; 生产者消费者流程图。