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

多线程间通信:多生产者-多消费者实例

    博客分类:
  • java
阅读更多
基于java的多线程编程必然躲不掉线程间通信这一步,因为java不像其他语言一般可以轻松的设置监听,所以我们多才用一些替代的办法,基于阻塞的生产者消费者模型就是一个很好的解决方案。

网上关于生产者消费者的例子并不少见,不过生产者或者消费者不只一个时,这个模型又有了新的变化。先上代码:


public class Test {
	public static void main(String[] args) {
		BlockingQueue<Integer> queue = new ArrayBlockingQueue<Integer>(10);
		P p1 = new P(queue, "1");
		P p2 = new P(queue, "2");
		C c1 = new C(queue, "1");
		C c2 = new C(queue, "2");
		p1.start();
		p2.start();
		c1.start();
		c2.start();
	}
}

以上为主程序
public class P extends Thread {
	String name;
	Logger logger = LoggerFactory.initLogger();
	BlockingQueue<Integer> queue;

	public P(BlockingQueue<Integer> queue, String name) {
		this.queue = queue;
		this.name = name;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		int i = 0;
		while (i++ < 100) {
			try {
				queue.put(i);
				logger.info(name + "生产:" + i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				Thread.currentThread().interrupt();
			}
		}
	}
}

此为生产者
public class C extends Thread {
	String name;
	Logger logger = LoggerFactory.initLogger();

	P p = null;
	BlockingQueue<Integer> queue;

	public C(BlockingQueue<Integer> queue, String name) {
		this.queue = queue;
		this.name = name;
	}

	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			try {
				int temp = (Integer) queue.take();
				logger.info(name + "消费:" + temp);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
}

此为消费者

其中需要log4j,用来打印输出观察生产消费的过程。

实际上我利用了BlockingQueue来做线程间通信的缓冲区,这是一个阻塞的队列,take方法和put方法非常适合多生产者多消费者模型。

附上文章中提到的简单程序,供参考。
0
0
分享到:
评论
1 楼 sw1982 2010-05-06  
...楼上介绍的是APIdoc文档还是?

相关推荐

    JavaMultiThreadingExamples:带有中文注释的基本Java多线程示例

    7- Java多线程:生产者-消费者 8- Java多线程:等待并通知 9- Java多线程:低级生产者-消费者 10- Java多线程:可重入锁 11- Java多线程:死锁 12- Java多线程:信号量 13- Java多线程:可调用和未来 14- Java多线程...

    Python自定义进程池实例分析【生产者、消费者模型问题】

    本文实例分析了Python自定义进程池。分享给大家供大家参考,具体如下: 代码说明一切: ...#消费者 class Consumer(Process): def __init__(self, queue, ioLock): super(Consumer, self).__init__() self.q

    vc源代码合集2244.rar

    2012-06-11 22:34 48,128 生产者消费者C++.doc 2012-06-11 22:36 34,816 稀疏矩阵的创建与相加.doc 2012-06-11 22:33 543,232 第11章 多线程下载工具.doc 2012-06-11 22:33 1,411,072 第15章 仿QQ游戏大厅.doc 2012-...

    基于C++实现多线程连接池MySQL源码+项目说明+详细代码注释.zip

    * 共享资源的访问,需要`互斥锁`(生产者消费者问题) ## 单例模式 * `懒汉模式` &gt; 当使用这个类的时候才创建它 &gt; 创建对象时,加锁保证有且仅有一个 &gt; (有线程安全问题) * `饿汉模式` &gt; 不管用不用它,只要类被创建...

    java多线程通信之等待唤醒机制

    典型实例有生产者和消费者,本文也通过实例来分析线程等待唤醒机制。  1、相关API介绍  public final void notify()  唤醒在此对象监视器上等待的单个线程,如果所有线程都在此对象上等待,则会任意选择唤醒...

    新版Android开发教程.rar

    ANDROID 的推出后可能影响的产业包括移动电信业,软件开发业,手机制造业,在以消费者为核心的状 态 。 对消费者的影响 � 高档手机选择面增加。 � A ndroid 在设计初期就考虑了与现其有业务的融合,改变以往从...

    【十三】Java多线程(指尖上的多线程[超详细])

    五、多线程之消费者与生产者、死锁 六、线程通信(实例详解) 七、线程池 八、线程安全的集合 思维导图参考: 【十三】Java多线程思维导图 一、什么是线程 什么是进程 什么是线程 线程,又称轻量级进程(Light ...

    java源码包---java 源码 大量 实例

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    嵌入式Linux程序设计案例与实验教程-实例代码

    实验2.3 Linux多线程使用实例——生产者-消费者协议24 2.4 进程创建以及进程间通信25 2.4.1 进程概述25 2.4.2 进程的相关函数25 2.4.3 信号概述27 2.4.4 信号的相关函数27 2.4.5 管道概述27 2.4.6 ...

    JAVA 范例大全 光盘 资源

    实例135 模拟生产者与消费者 392 实例136 仿迅雷下载文件 396 第15章 图形编程 403 实例137 多变的按钮 403 实例138 自制对话框 405 实例139 模仿QQ空间的电子相册 409 实例140 会动的七彩文字 413 实例141 ...

    WindowsAPI示例程序

    树控件,多线程、临界区,互斥量,信号量,事件,互锁函数,生产者消费者问题,哲学家进餐问题,管道,管道重定向,邮件槽在进程间通信,共享内存在进程间通信,tcp通信,udp通信,自定义消息进程通信

    JAVA上百实例源码以及开源项目源代码

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    java编程基础,应用与实例

    14.7.4 多消费者 224 14.8 stop()、suspend()和resume() 225 14.9 巩固练习 226 第15章 常用API之二 228 15.1 Collection接口 228 15.1.1 Set接口 228 15.1.2 List接口 230 15.1.3 Map接口 232 ...

    并行计算导论(原书第2版).[美]Ananth Grama(带详细书签).pdf

    3.6.5 流水线模型或生产者-消费者模型 3.6.6 混合模型 3.7 书目评注 习题 第4章 基本通信操作 4.1 一对多广播以及多对一归约 4.1.1 环或线性阵列 4.1.2 格网 4.1.3 超立方体 4.1.4 平衡二叉树 4.1.5 算法...

    JAVA上百实例源码以及开源项目

     Java局域网通信——飞鸽传书源代码,大家都知道VB版、VC版还有Delphi版的飞鸽传书软件,但是Java版的确实不多,因此这个Java文件传输实例不可错过,Java网络编程技能的提升很有帮助。 Java聊天程序,包括服务端和...

    基于C、C++和ffmpeg编写的trt_yolov8推理模块源码+使用说明(拉流解码输入、支持cuda硬件解码).zip

    将trt实例放入trt_node中,这里的trt_node就是充当一个生产者节点和trt实例(消费者)的桥梁,保证我们多路时的数据在指定的线程中运行的 ~~~c++ trt_node-&gt;set_trt_instance(trt_instance); ~~~ 将各个节点串联...

Global site tag (gtag.js) - Google Analytics