`
xyqck163
  • 浏览: 105381 次
  • 性别: 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信号量实现的单生产者多消费者模式下的消息队列,可在多线程应用中对不同的消息结构体进行数据传输。

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

    一个生产者和一个消费者访问同一缓冲区,缓冲区初始大小为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-...

    多生产者多消费者问题源码

    问题出现在当缓冲区已经满了,而此时生产者还想向其中放入一个新的数据项的情形,其解决方法是让生产者此时进行休眠,等待消费者从缓冲区中取走了一个或者多个数据后再去唤醒它。同样地,当缓冲区已经空了,而消费者...

    生产者与消费者问题

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

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

    编写一个“生产者-消费者”的多线程演示程序,两个生产者,一个消费者,可以存放产品的仓库容量为10,仓库用栈实现,并有同步功能,且能防止先消费后生产的情况。

    编程实现生产者消费者或读写者的同步问题

    设计在同一个进程地址空间内执行...生产者线程生产物品时,若无空缓冲区可用,生产者线程必须等待消费者线程释放出一个空缓冲区;消费者线程消费物品时,若无满的缓冲区,消费者线程将被阻塞,直到新的物品被生产出来。

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

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

    生产者-消费者问题.cpp

    该类问题不允许消费者进程到一个空缓冲区中取产品,同时也不允许生产者进程到一个已满且还没被取走的缓冲区中投放产品。 使用一个数组来表示具有n个(0,1,…,n-1)缓冲区的缓冲池。用输入指针in来指示下一个可投放...

    使用多线程程序模拟实现单生产者/多消费者问题(Linux下C语言)。

    要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将这个整数加 4 后输出。当程序接收到键盘输入“q”...

    操作系统课程设计生产者和消费者问题源代码

    ②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并...

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

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

    用多进程同步方法演示“生产者-消费者”问题

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

    多个消费者生产者模型

    多个生产者消费者,可以分别设定生产者各生产多少个产品,产品id自增长,name随机,prince随机。放到队列,多个消费者取队列里的产品,直到队列里产品全部取出,按产品属性排序输出。

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

    可设多个生产者和消费者,还有产品和缓冲区

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

    用多进程同步方法解决生产者—消费者问题(c++源码) 1、每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针...3、多个生产者或多个消费者之间须有共享对缓冲区进行操作的函数代码。

Global site tag (gtag.js) - Google Analytics