`
unbounder
  • 浏览: 174420 次
  • 性别: 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文档还是?

相关推荐

    linux下的多线程实例--生产者消费者

    ### Linux下的多线程实例——生产者消费者模型 在Linux环境下进行多线程编程时,一个常见的应用场景就是通过生产者消费者模型来管理线程间的通信和数据共享问题。本篇文章将详细解析一个基于Linux环境下的多线程...

    多线程实例,关于生产者与消费者的问题

    "生产者-消费者问题"是多线程编程中一个经典的同步问题,它涉及到资源的共享和线程间的协作。这个问题的核心在于如何有效地协调生产者线程(负责生产数据)和消费者线程(负责消费数据),使得生产与消费的过程既...

    C++ builder 多线程实例(生产-消费)

    在这个“C++ Builder 多线程实例(生产-消费)”中,我们将探讨如何应用多线程技术来模拟生产者和消费者的问题,这是一个经典的并发编程模型。 生产者-消费者问题是一个典型的同步问题,旨在展示如何在共享资源之间...

    12.2 Qt5多线程:使用QWaitCondition实现生产者和消费者

    总的来说,QWaitCondition是Qt5多线程编程中用于线程间通信和同步的强大工具,尤其在处理生产者-消费者问题时。通过熟练运用QWaitCondition,开发者可以构建出高效、稳定、响应迅速的应用程序。

    JAVA实现线程间同步与互斥生产者消费者问题

    本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费者问题是经典的并发问题之一,它涉及到两个类型的线程:生产者和消费者。生产者负责生成数据(产品),而消费者则...

    bcb 多线程示例 MutilThread(生产者与消费者)

    在本示例"bcb 多线程示例 MutilThread(生产者与消费者)"中,我们将探讨 Borland C++ Builder (bcb) 平台上的线程应用,特别是生产者-消费者问题的解决方案。 生产者-消费者问题是多线程编程中的一个经典案例,它...

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

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

    编程模拟实现生产者-消费者进程

    生产者-消费者问题是操作系统中进程间通信的经典案例之一。该问题主要描述了一组生产者进程不断生成数据并将其放置在一个共享缓冲区中,而一组消费者进程则从这个缓冲区中取出数据进行处理的过程。为了确保系统的...

    线程间资源互斥与通信(生产者消费者)

    本实例将深入探讨"生产者消费者"模型,这是线程间通信的一个经典案例,用于展示如何高效地共享有限资源。 生产者消费者模式是一种设计模式,它基于操作系统中的队列数据结构。在该模型中,"生产者"线程负责生成数据...

    生产者消费者 多线程

    总结一下,"生产者消费者"多线程模型关注的是如何有效地在生产者与消费者之间共享和管理资源,通常通过`BlockingQueue`实现线程间的同步和通信。而`ThreadLocal`则是在多线程环境中创建线程局部变量,保证数据的安全...

    C++ 多线程 PV模拟生产者消费者模型多个实例

    "C%2B%2B+builder+%E5%A4%9A%E7%BA%BF%E7%A8%8B%E5%AE%9E%E4%BE%8B%EF%BC%88%E7%94%9F%E4%BA%A7-%E6%B6%88%E8%B4%B9%EF%BC%89.rar"是一个压缩包,其中可能包含了一个使用C++ Builder编写的多线程生产者消费者实例,...

    java多线程_消费者与生产者模型

    在Java多线程编程中,消费者-生产者模型是一种经典的线程间通信模式,用于解决多线程环境下的数据共享问题。该模型涉及到两个主要的角色:生产者(Producer)和消费者(Consumer)。生产者负责创建数据,而消费者则...

    生产者消费者程序-Linux

    生产者消费者模型是一种经典的多线程同步问题,广泛应用于计算机科学和操作系统领域。在Linux环境中,这个模型通过信号量机制和缓冲区来实现线程间的通信和资源管理。以下是关于这个主题的详细解释: 1. **生产者...

    生产者与消费者实验报告

    3. **能够在多线程环境下实现简单的生产者与消费者模型,并对其性能进行分析**。 4. **学会分析和解决在多线程编程中常见的问题,如死锁、饥饿等**。 #### 四、实验环境与工具 - **操作系统**:Windows/Linux/Unix...

    多线程代码实例

    本文将详细解析"多线程代码实例",主要关注在Linux环境中,使用C语言实现的生产消费管理系统,以及如何利用POSIX线程库(pthread)中的互斥量和条件变量来管理共享资源。 首先,我们了解多线程的基本概念。多线程是...

    java 多线程并发实例

    - 生产者-消费者模型:这是一个经典的多线程设计模式,用于解决资源的生产与消费问题。生产者线程负责生成数据,放入缓冲区;消费者线程则负责取出数据进行处理。Java的BlockingQueue接口(如ArrayBlockingQueue)...

    多线程通信多线程通信

    此外,还需要考虑线程间的通信,如生产者消费者模型、信号量机制等。例如,使用队列作为共享数据结构,接收线程将接收到的消息放入队列,处理线程从队列中取出消息进行处理,这样可以避免直接的数据共享,简化同步...

    生产者-消费者.zip

    在项目的"生产者-消费者"代码中,可以预见到它将展示如何创建`BlockingQueue`实例,然后在生产者线程中调用`put`方法向队列添加元素,在消费者线程中调用`take`方法取出元素。同时,可能还会有异常处理和中断机制,...

Global site tag (gtag.js) - Google Analytics