`

Thread生产者消费者例子

阅读更多
引用

java多线程一般都会讲消费者-生产者模型

生产者与消费者模型中,要保证以下几点:
1 同一时间内只能有一个生产者生产
2 同一时间内只能有一个消费者消费
3 生产者生产的同时消费者不能消费
4 消息队列满时生产者不能继续生产
5 消息队列空时消费者不能继续消费


[size=small]package com.yss.test.thread;

import java.util.ArrayList;
import java.util.List;

public class Producer_Consumer_Test {
	public static void main(String[] args) {

		Queue Q = new Queue();

		Producer wQ1 = new Producer(Q);
		Producer wQ2 = new Producer(Q);
		Producer wQ3 = new Producer(Q);
//		Producer wQ4 = new Producer(Q);
//		Producer wQ5 = new Producer(Q);
		
		Consumer rQ1 = new Consumer(Q);
		Consumer rQ2 = new Consumer(Q);
		Consumer rQ3 = new Consumer(Q);
		Consumer rQ4 = new Consumer(Q);
		Consumer rQ5 = new Consumer(Q);

//		Thread threadWQ1 = new Thread(wQ1, "thread-wQ1");
//		Thread threadWQ2 = new Thread(wQ2, "thread-wQ2");
//
//		Thread threadRQ1 = new Thread(rQ1, "thread-rQ1");
//		Thread threadRQ2 = new Thread(rQ2, "thread-rQ2");
//		Thread threadRQ3 = new Thread(rQ3, "thread-rQ3");

		wQ1.start();
		wQ2.start();
		wQ3.start();
//		wQ4.start();
//		wQ5.start();

		rQ1.start();
		rQ2.start();
		rQ3.start();
		rQ4.start();
		rQ5.start();
	}
}
/**
 * 队列
 * @author DELL
 *
 */
class Queue {
	List<Message> queue = new ArrayList<Message>();

	/** 队列中message对象的最大值,默认为5 */
	int maxMessageNum = 5;
	//生产产品
	public synchronized void produce(Message message) {
		while (queue.size() == maxMessageNum) {
			System.out.println(Thread.currentThread().getName()
					+ "  队列满!等待中。。。");
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		queue.add(message);
		System.out.println(Thread.currentThread().getName() + "正在生产"
				+ message.getContent() + "。。。  ,当前个数:" + getCount());
		this.notifyAll();

	}
	//消费产品
	public synchronized void consume() {
		while (queue.size() == 0) {
			System.out.println(Thread.currentThread().getName()
					+ "  队列空!等待中。。。");
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		Message message = queue.get(0);
		queue.remove(0);
		System.out.println(Thread.currentThread().getName() + "正在消费"
				+ message.getContent() + "。。。 ,当前个数: " + getCount());
		this.notifyAll();

	}

	public synchronized int getCount() {
		return queue.size();
	}
}
/**
 * 生产者
 * @author DELL
 *
 */
class Producer extends Thread {

	private Queue queue;

	Producer(Queue queue) {
		this.queue = queue;
	}

	public void run() {

		while (true) {
			Message message = new Message();
			message.setId(++Message.id);
			message.setContent("food" + Message.id);
			queue.produce(message);
			try {
				sleep(1000);
			} catch (Exception e) {
			}
		}

	}
}

/**
 * 消费者
 * @author qinglong
 *
 */
class Consumer extends Thread {
	private Queue queue;

	Consumer(Queue queue) {
		this.queue = queue;
	}

	public void run() {
		while (true) {
			queue.consume();
			try {
				sleep(1000);
			} catch (Exception e) {
			}

		}
	}
}
/**
 * 消息类
 * @author qinglong
 *
 */
class Message {
	public static int id;
	public String content;

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		Message.id = id;
	}
}[/size]
分享到:
评论

相关推荐

    labview 生产者消费者例子

    7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...

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

    首先,生产者消费者问题是多线程并发控制中的一个经典例子。在该模型中,我们有两个类型的线程:生产者线程负责生成数据,而消费者线程负责消耗这些数据。关键在于确保生产者不会在消费者未准备好接收数据时生产过多...

    java 生产者消费者问题(源码)

    通过这个例子,我们可以看到Java的并发工具如`BlockingQueue`是如何简化生产者消费者问题的解决方案的。这种设计模式在多线程应用程序中非常常见,例如在消息队列、任务调度等场景。理解并熟练掌握这一概念对于提升...

    生产者与消费者 java实现

    在这个例子中,我们创建了一个`Buffer`类作为共享资源,`Producer`和`Consumer`类分别代表生产者和消费者。`Buffer`类中的`put()`和`take()`方法使用`synchronized`关键字保证了线程安全,并使用`wait()`和`...

    生产者消费者同步问题

    生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发环境下高效且安全地共享有限资源。在这个问题中,我们通常有两类线程:生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了解决线程间...

    生产者消费者多线程代码

    在Java或C++等编程语言中,我们可以利用多线程来实现“生产者消费者”模式,这是一个经典的并发问题。这个模式涉及到两个主要角色:生产者(Producer)和消费者(Consumer),它们共享一个有限大小的缓冲区作为临界...

    生产者消费者问题java

    生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步问题。在这个问题中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。Java作为一门支持多线程的编程语言,提供...

    并行openmp程序实现生产者消费者

    在这个例子中,"并行openmp程序实现生产者消费者"可能是通过OpenMP库来创建两个线程,一个扮演生产者的角色,另一个扮演消费者的角色。生产者线程负责生成数据,而消费者线程则处理这些数据。这种模式在处理大量数据...

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

    总的来说,这个例子展示了如何使用Java的多线程同步机制来解决生产者-消费者问题。通过合理地使用`synchronized`关键字以及`wait()`、`notifyAll()`方法,可以实现对共享资源的并发访问控制,保证程序的正确性和效率...

    java多线程例子-生产者消费者

    在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...

    生产者与消费者问题

    6. **示例代码**:一个简单的生产者消费者实现可能会包含两个线程,一个生产者线程负责将数据放入队列,一个消费者线程负责从队列中取出数据。每个线程都会在适当的时机调用`wait()`和`notify()`或`notifyAll()`来...

    线程同步--生产者消费者问题

    在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...

    java操作系统生产者消费者问题模拟

    这个简单的例子展示了Java如何通过`BlockingQueue`解决生产者-消费者问题。在实际应用中,可能还需要考虑更多的因素,比如异常处理、线程同步、资源释放等。通过这种方式,我们可以在不引入复杂的同步机制(如`...

    C++ PV操作(生产者/消费者)简单实例

    在这个例子中,代码展示了如何使用同步方法(`synchronized` 关键字)来模拟 PV 操作,并解决了生产者-消费者问题。 ##### 容器类 `RongQi` - **成员变量**: - `String food[]`:用于存储生产者产生的数据(这里...

    C++ 多线程通信方式简介并结合生产者-消费者模式代码实现

    在这个例子中,生产者在队列满时等待,消费者在队列空时等待。当条件满足时,生产者和消费者会唤醒对方,实现高效的数据交换。 总结,C++的多线程通信涉及线程创建、同步机制以及模式设计。通过合理地运用这些工具...

    一个生产者与消费者的例子.

    生产者与消费者问题是一个经典的多线程同步问题,在计算机科学和软件工程中有着广泛的应用。这个问题的核心在于如何在多个线程之间有效地共享有限的资源,确保数据的一致性和避免竞争条件。在这个例子中,我们将深入...

    java生产者与消费者问题

    在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...

    C++ 用多方程解决生产者与消费者的问题

    这个简单的例子展示了如何使用C++的同步原语来解决生产者-消费者问题。然而,在实际应用中,可能需要考虑更多的细节,比如加入退出条件、异常处理、资源管理等。此外,还可以使用信号量(semaphores)来替代条件变量...

    生产者与消费者(C#)

    总的来说,这个例子深入浅出地演示了C#中如何利用多线程和同步机制实现生产者与消费者的经典模型,这对于理解和应用多线程编程,尤其是解决并发问题有着重要的参考价值。通过这种方式,我们可以构建高效、安全的多...

    .net 多线程 模拟生产者消费者(WindForm版)

    本文将深入探讨如何在Windows Forms(WindForm)应用程序中实现多生产者消费者模式,以及如何利用.NET框架中的线程安全机制来确保数据的正确性和程序的稳定性。 首先,我们要理解生产者消费者模式的基本概念。这是...

Global site tag (gtag.js) - Google Analytics