`

用java 实现生产者、消费者模型

    博客分类:
  • JAVA
 
阅读更多

public class MessageQueue {

	private List<String> queue = new ArrayList<String>();

	public synchronized String getMessage() throws InterruptedException {
		while (queue.isEmpty()) {
			wait();
		}
		String message = queue.remove(0);
		notify();
		return message;
	}

	public synchronized void putMessage(String message) throws InterruptedException {
		if (!queue.isEmpty()) {
			wait();
		}
		queue.add(message);
		notify();
	}

	public static void main(String[] args) {
		MessageQueue queue = new MessageQueue();
		new Thread(new MessageProducer("生产者1", queue)).start();
		new Thread(new MessageProducer("生产者2", queue)).start();
		new Thread(new MessageConsumer("消费者1", queue)).start();
		new Thread(new MessageConsumer("消费者2", queue)).start();
		new Thread(new MessageConsumer("消费者3", queue)).start();
		new Thread(new MessageConsumer("消费者4", queue)).start();
		new Thread(new MessageConsumer("消费者5", queue)).start();
		new Thread(new MessageConsumer("消费者6", queue)).start();
	}
}

public class MessageProducer implements Runnable {

	private MessageQueue queue;

	private String name;

	public MessageProducer(String name, MessageQueue queue) {
		super();
		this.queue = queue;
		this.name = name;
	}

	@Override
	public void run() {
		int i = 0;
		while (i < 20) {
			i++;
			try {
				try {
					Thread.sleep((long) (Math.random() * 1000));
				}
				catch (InterruptedException e) {
					e.printStackTrace();
				}
				queue.putMessage("***" + name + "*** 生产了 第 " + i + "  消息!");
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}

public class MessageConsumer implements Runnable {

	private MessageQueue queue;

	private String name;

	public MessageConsumer(String name, MessageQueue queue) {
		this.queue = queue;
		this.name = name;
	}

	@Override
	public void run() {
		try {
			while (true) {
				try {
					Thread.sleep((long) (Math.random() * 1000));
				}
				catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println(name + "==>读取消息:" + queue.getMessage());
			}
		}
		catch (InterruptedException e) {
			e.printStackTrace();
		}

	}

}

分享到:
评论

相关推荐

    java实现多线程经典模型生产者消费

    java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现多线程经典模型生产者消费java实现...

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

    首先,我们要理解生产者-消费者模型的基本概念。在这个模型中,“生产者”线程负责生成产品并放入“仓库”,而“消费者”线程则负责从仓库中取出产品并进行消费。为了保证数据的一致性和避免竞态条件(多个线程同时...

    java实现生产者消费者

    在Java编程中,"生产者消费者"模式是一种典型的多线程问题解决模型,它通过共享资源来协调生产者和消费者之间的操作。这个模式的核心在于如何有效地管理资源的生产和消费,以避免生产过快导致资源浪费,或者消费者...

    java生产者消费者模型

    Java生产者消费者模型是多线程编程中一种经典的并发控制模型,它源于操作系统中的哲学思想,用于解决资源的共享和异步处理问题。在该模型中,"生产者"线程负责生成数据,而"消费者"线程则负责消费这些数据。两者之间...

    java多线程经典模型生产者消费者

    java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型生产者消费者java多线程经典模型...

    java多线程实现生产者和消费者

    `BlockingQueue`接口提供了线程安全的队列,自动处理了等待和唤醒操作,是实现生产者-消费者模型的一种高效方式。 4. **条件变量**:`wait()`, `notify()`和`notifyAll()`是基于条件变量的,它们可以使得线程在特定...

    操作系统:多线程处理生产者消费者,java实现

    基本满足操作系统课上要求,java实现的生产者消费者模型。

    生产者与消费者 java实现

    本主题将深入探讨生产者与消费者模型的Java实现。 生产者与消费者问题的核心是有一个共享资源(例如,一个缓冲区),生产者不断地生产产品并放入缓冲区,而消费者则从缓冲区取出产品进行消费。关键在于确保生产者...

    Java实现生产者消费者模型

    生产者消费者模型,是一般面试题都会考的,下面介绍使用ReetrantLock实现 生产者消费者模型。 定义一个ReentrantLock锁,同时new出两个condition,一个控制队满,一个 控制队空 //生产者 消费者 import java.util....

    Java线程间的通信----生产者消费者模型

    3. **生产者消费者模型的实现步骤**: - 创建一个阻塞队列作为共享数据结构。 - 生产者线程负责向队列中添加元素,当队列满时,调用`put()`方法会阻塞生产者。 - 消费者线程负责从队列中移除元素,当队列空时,...

    操作系统课程设计——生产者消费者问题Java图形界面动态演示

    设计目的:通过研究Linux 的进程机制和信号量实现生产者消费者问题的并发控制。说明:有界缓冲区内设有20 个存储单元,放入/取出的数据项设定为1‐20 这20 个整型数。设计要求:1)每个生产者和消费者对有界缓冲区...

    Java 线程间通信,生产者与消费者模型

    使用wait()和notify()实现的生产者与消费者模型,可以了解如何使用wait()和notify()进行线程间通信。(上一次上传的代码有一个问题没有考虑到,这次修补了——CSDN没法撤销资源,只能再上传了)

    java 编写的生产者与消费者问题

    这个库提供了多种工具类,如Semaphore(信号量)、BlockingQueue(阻塞队列)和Condition(条件变量),这些都可以用来实现生产者-消费者模型。 1. **BlockingQueue**: 阻塞队列是一种特殊的队列,它具有线程安全的...

    生产者 消费者 进程 可视化 java

    在Java编程中,"生产者-消费者"模型是一种常见的多线程问题,它涉及到进程间的同步与通信。在这个模型中,生产者线程负责生成数据并放入缓冲区,而消费者线程则负责从缓冲区取出数据进行处理。这里的"车库"例子就是...

    java生产者消费者问题

    在CSDN.NET博客文章中,作者详细讨论了如何使用线程同步和等待的应用来解决此问题,并提供了示例代码ProducerConsumer.java和ProducerConsumerx.java,这些代码可以帮助读者更好地理解和实现生产者消费者模型。...

    生产者消费者问题 Java实现

    在生产者消费者问题的Java实现中,通常会使用一个有界缓冲区来存储数据。这个缓冲区可以用数组或`BlockingQueue`来实现。`BlockingQueue`是一个线程安全的数据结构,它内置了同步机制,可以避免死锁和资源浪费。 ...

    自己用Java写的简单生产者与消费者模型

    在Java中实现生产者-消费者模型时,通常会用到`java.lang.Thread`类或`java.util.concurrent.ExecutorService`接口来创建和管理线程,同时利用`synchronized`关键字、`wait()`、`notify()`或`notifyAll()`方法来实现...

    java多线程实现生产者消费者关系

    在Java中,我们可以使用BlockingQueue接口及其实现类(如ArrayBlockingQueue)来实现生产者消费者模型。BlockingQueue提供了一种线程安全的队列,它内置了同步机制,使得生产者在队列满时会被阻塞,消费者在队列空时...

    java 生产者消费者演示程序

    在这个示例程序中,我们使用了Java语言实现了生产者消费者模型。我们首先创建了一个 GoodsBuffer 对象,该对象充当缓冲区的角色。然后,我们创建了两个生产者对象(Producer),并将其优先级设置为10,这是最高的...

    生产者消费者问题和先来先服务算法

    在Java中,生产者消费者问题的实现通常涉及`BlockingQueue`接口,如`ArrayBlockingQueue`。生产者线程使用`put()`方法添加元素到队列,若队列已满则会被阻塞;消费者线程使用`take()`方法获取并移除元素,若队列为空...

Global site tag (gtag.js) - Google Analytics