`
xyqck163
  • 浏览: 106640 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

一个生产者 多个消费者

阅读更多

将传统生产者消费者模式里的notify  换成了  notifyAll

 

import java.util.Collections;
import java.util.LinkedList;
import java.util.List;

public class ProducerModular {

	public static void main(String[] args) throws InterruptedException {
		MyShare share = new MyShare();

		Thread provider = new MyProvider(share);
		Thread bailing = new MyBailing(share, "baiLing one ");

		Thread bailing2 = new MyBailing(share, "baiLing two ");

		provider.setDaemon(true);
		bailing.setDaemon(true);

		bailing2.setDaemon(true);

		System.out.println("0.01秒生产消费者模式");
		bailing.start();
		bailing2.start();
		provider.start();

		Thread.sleep((long) (0.01 * 1000));

		provider.interrupt();// 中断结束线程
		bailing.interrupt(); // 中断结束线程
		bailing2.interrupt();// 中断结束线程

		provider.join();
		bailing.join();
		bailing2.join();
		System.out.println("--------------| 结束");
	}
}

/**
 * 生产者
 * 
 * @author chengkai
 * 
 */
class MyProvider extends Thread {

	private MyShare myshare;

	public MyProvider(MyShare myshare) {
		super();
		this.myshare = myshare;
	}

	// private Thread cThread;
	@Override
	public void run() {
		// this.cThread=Thread.currentThread();
		try {
			while (!Thread.currentThread().isInterrupted()) {

				String str = "" + (char) this.random(1, 255);
				myshare.charSetting(str);
				// System.out.println("生产了                                    :    "
				// + str);

			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			return;
		}
	}

	public int random(int start, int end) {
		double result = Math.random() * (end - start + 1) + start;
		return (int) result;
	}

	// public void toStop(){
	//		
	// }

}

/**
 * 消费者(白领)
 * 
 * @author chengkai
 * 
 */
class MyBailing extends Thread {

	private MyShare myshare;

	public MyBailing(MyShare myshare, String name) {
		super(name);
		this.myshare = myshare;
	}

	@Override
	public void run() {
		try {
			while (!Thread.currentThread().isInterrupted()) {
				String str = myshare.getCharVar();
				// System.out.println(this.getName()+"  消费了:    " + str);
			}
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			return;
		}
	}

}

/**
 * 通道 //适用于1个生产者 ,多个消费者  
 * 
 * @author chengkai
 * 
 */
class MyShare {

	List<String> shareList = Collections.synchronizedList(new LinkedList());

	public synchronized void charSetting(String product)
			throws InterruptedException {

		while (shareList.size() != 0) {
			this.wait();
		}

		this.push(product);
		System.out.println(Thread.currentThread().getName()
				+ " 生产了             ---|  " + product);
		this.notifyAll();

	}

	public synchronized String getCharVar() throws InterruptedException {

		while (shareList.size() == 0) {
			this.wait();
		}

		String str = this.popLast();
		System.out.println(Thread.currentThread().getName() + " 消费了   ---|  "
				+ str);
		this.notifyAll();
		return str;

	}

	/*********************
	 * 设置和输出队列
	 * 
	 * @param obj
	 */

	private void push(String obj) {
		synchronized (shareList) {
			shareList.add(0, obj);
		}
	}

	private String popLast() {
		synchronized (shareList) {
			if (shareList.size() == 0) {
				return null;
			}
			return shareList.remove(this.shareList.size() - 1);
		}
	}

}

输出结果:
0.01秒生产消费者模式
Thread-0 生产了        ---|  ú
baiLing two  消费了   ---|  ú
Thread-0 生产了        ---|  Ò
baiLing one  消费了   ---|  Ò
Thread-0 生产了        ---|  9
baiLing two  消费了   ---|  9
Thread-0 生产了        ---|  „
baiLing one  消费了   ---|  „
Thread-0 生产了        ---|  ,
baiLing two  消费了   ---|  ,
Thread-0 生产了        ---|  i
baiLing one  消费了   ---|  i
Thread-0 生产了        ---|  
baiLing two  消费了   ---|  
Thread-0 生产了        ---|  l
baiLing one  消费了   ---|  l
Thread-0 生产了        ---|  »
baiLing two  消费了   ---|  »
Thread-0 生产了        ---|  «
baiLing one  消费了   ---|  «
Thread-0 生产了        ---|  ß
baiLing two  消费了   ---|  ß
Thread-0 生产了        ---|  |
baiLing one  消费了   ---|  |


...... 
分享到:
评论

相关推荐

    使用Qt信号量实现单生产者多消费者模型

    通过以上方式,我们可以构建一个基于Qt的单生产者多消费者模型。这种模型可以有效地管理多线程环境中的资源,确保数据的正确传输,并避免线程间的竞态条件和死锁问题。在实际项目中,可以根据具体需求调整信号量的值...

    springboot+dubbo+zookeeper实现多个生产者、消费者的负载均衡

    在本项目中,我们主要探讨的是如何利用SpringBoot、Dubbo和Zookeeper来构建一个具有多个生产者和消费者的分布式服务系统,并实现负载均衡。以下是详细的知识点解释: 1. **SpringBoot**: SpringBoot是Spring框架...

    线程问题生产者消费者流程图

    生产者消费者流程图; 生产者消费者流程图。

    生产者消费者访问同一缓冲区

    一个生产者和一个消费者访问同一缓冲区,缓冲区初始大小为10,(可以设定)。生产者产生随机数,消费者取走随机数,用同步和互斥实现,并在控制台打印,VC6.0编译成功

    生产者消费者问题

    创建5个进程,其中两个...3个消费者不断地从缓冲中读取一个字符并输出。一个消费者只消费小写字符,一个消费者只消费大写字母,而另一个消费者则无选择地消费任何产品。消费者要消费的产品没有时,消费者进程被阻塞。

    dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子

    1.dubbo-zookeeper springSpringMVC 一个生产者,多消费者 例子 2. ssm-dubbo 源码 ssm-tomcat 里放的是 warbao ,程序包 zookeeper-3.4.9 zookeeper 免安装包 设置都是默认的 zookeeper 端口 2181 dubbo-...

    多个消费者生产者模型

    "多个消费者生产者模型"是一种典型的多线程同步问题的解决方案,它主要用于处理并发操作中的资源分配和协调。在这个模型中,"生产者"负责生成数据或任务,而"消费者"则负责处理这些数据或任务。接下来,我们将深入...

    Java多线程实现生产者消费者

    在这个`Warehouse`类中,`produce()`和`consume()`方法都是`synchronized`的,确保同一时间只有一个生产者或消费者可以执行。如果仓库已满,生产者会调用`wait()`进入等待状态,直到其他线程调用`notifyAll()`唤醒...

    多线程简易实现生产者消费者模式

    6. **启动线程**:创建多个生产者和消费者线程,然后启动它们,线程会按照规则交替执行,实现生产与消费的平衡。 在提供的文件"stack"中,可能包含了一个使用栈作为缓冲区的生产者消费者模式实现。栈具有后进先出...

    生产者与消费者问题

    假设M个生产者和N个消费者共享一个具有K(K大于1)个缓冲区的循环缓冲结构BUFFER(提示:可以用一个循环...当无满缓冲区时消费者线程阻塞,并且多个生产者线程对IN的使用必须互斥,多个消费者线程对OUT的使用也必须互斥

    C++ windows版 多生产者多消费者的队列实现

    在IT领域,多生产者多消费者(Multiple Producer-Multiple Consumer, MP-MC)模型是一种常见的并发编程模式,它主要用于处理数据共享的问题。在Windows环境下,使用C++来实现这一模型通常涉及到线程同步和互斥量等...

    生产者和消费者模式多线程

    生产者和消费者模式具有很好的扩展性,不仅可以有一个生产者和一个消费者,也可以有多个。这种模式适用于多个线程之间需要协作处理数据的情况,如消息队列、数据库缓存更新等场景。 8. **示例代码:** 创建一个...

    模拟消费者生产者实验

    在操作系统设计中,有一个经典的问题被称为“生产者-消费者问题”(Producer-Consumer Problem),这是一个多线程同步问题的经典示例。在这个实验中,我们将深入探讨这一概念,并通过Java编程语言来实现。 生产者-...

    vc 多个生产者和消费者问题

    在计算机科学和编程领域,"多个生产者和消费者问题"是一个经典的并发控制问题,它涉及到多线程或进程之间的同步。在Windows环境下,VC(Visual C++)是常用的开发工具,可以用来解决这类问题。本篇文章将深入探讨...

    多进程同步解决生产者消费者问题(c++源码)

    3. **共享缓冲区操作**:多个生产者或多个消费者之间需要有共享对缓冲区进行操作的函数代码。 #### 三、实现原理与代码解析 本节将详细介绍如何使用C++语言中的多进程同步机制来实现上述功能。 #### 1. 基础数据...

    生产者-消费者多线程处理

    在实际应用中,生产者-消费者模型可以被扩展到多个生产者和多个消费者,且缓冲区大小可以动态调整。此外,为了防止死锁和饥饿现象,还需要考虑适当的同步策略,如公平性和优先级反转的处理。 总之,"生产者-消费者...

    操作系统课设用多进程同步方法演示“生产者-消费者”问题

    5) 多个生产者或多个消费者之间必须有共享对缓冲区进行操作的函数代码 6) 每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容、当前生产者与消费者的指针位置,以及生产者和消费者线程标识符 ...

Global site tag (gtag.js) - Google Analytics