引用
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]
分享到:
相关推荐
7. **例程分析**:在提供的"生产者消费者"例程中,可能包含了创建生产者和消费者线程、初始化队列、添加数据到队列、从队列中取出数据、以及使用同步机制保证正确性的代码片段。通过对这些例程的分析和运行,可以...
首先,生产者消费者问题是多线程并发控制中的一个经典例子。在该模型中,我们有两个类型的线程:生产者线程负责生成数据,而消费者线程负责消耗这些数据。关键在于确保生产者不会在消费者未准备好接收数据时生产过多...
通过这个例子,我们可以看到Java的并发工具如`BlockingQueue`是如何简化生产者消费者问题的解决方案的。这种设计模式在多线程应用程序中非常常见,例如在消息队列、任务调度等场景。理解并熟练掌握这一概念对于提升...
在这个例子中,我们创建了一个`Buffer`类作为共享资源,`Producer`和`Consumer`类分别代表生产者和消费者。`Buffer`类中的`put()`和`take()`方法使用`synchronized`关键字保证了线程安全,并使用`wait()`和`...
生产者消费者问题是多线程编程中的一个经典案例,主要探讨如何在并发环境下高效且安全地共享有限资源。在这个问题中,我们通常有两类线程:生产者线程负责生成数据,而消费者线程则负责消费这些数据。为了解决线程间...
在Java或C++等编程语言中,我们可以利用多线程来实现“生产者消费者”模式,这是一个经典的并发问题。这个模式涉及到两个主要角色:生产者(Producer)和消费者(Consumer),它们共享一个有限大小的缓冲区作为临界...
生产者消费者问题是多线程编程中的一个经典案例,它展示了如何通过线程间的协作来解决资源的同步问题。在这个问题中,"生产者"负责创建数据,而"消费者"则负责处理这些数据。Java作为一门支持多线程的编程语言,提供...
在这个例子中,"并行openmp程序实现生产者消费者"可能是通过OpenMP库来创建两个线程,一个扮演生产者的角色,另一个扮演消费者的角色。生产者线程负责生成数据,而消费者线程则处理这些数据。这种模式在处理大量数据...
总的来说,这个例子展示了如何使用Java的多线程同步机制来解决生产者-消费者问题。通过合理地使用`synchronized`关键字以及`wait()`、`notifyAll()`方法,可以实现对共享资源的并发访问控制,保证程序的正确性和效率...
在本示例中,“java多线程例子-生产者消费者”旨在展示如何利用多线程来实现生产者和消费者模式。这种模式是并发编程中的经典设计模式,用于协调生产数据和消费数据的两个不同线程。 生产者消费者模式的基本概念是...
6. **示例代码**:一个简单的生产者消费者实现可能会包含两个线程,一个生产者线程负责将数据放入队列,一个消费者线程负责从队列中取出数据。每个线程都会在适当的时机调用`wait()`和`notify()`或`notifyAll()`来...
在Java编程中,"线程同步--生产者消费者问题"是一个经典的多线程问题,它涉及到如何有效地在多个线程之间共享资源。这个问题通常用于演示和理解线程间的协作机制,如互斥锁、条件变量等。在此,我们将深入探讨这个...
这个简单的例子展示了Java如何通过`BlockingQueue`解决生产者-消费者问题。在实际应用中,可能还需要考虑更多的因素,比如异常处理、线程同步、资源释放等。通过这种方式,我们可以在不引入复杂的同步机制(如`...
在这个例子中,代码展示了如何使用同步方法(`synchronized` 关键字)来模拟 PV 操作,并解决了生产者-消费者问题。 ##### 容器类 `RongQi` - **成员变量**: - `String food[]`:用于存储生产者产生的数据(这里...
在这个例子中,生产者在队列满时等待,消费者在队列空时等待。当条件满足时,生产者和消费者会唤醒对方,实现高效的数据交换。 总结,C++的多线程通信涉及线程创建、同步机制以及模式设计。通过合理地运用这些工具...
生产者与消费者问题是一个经典的多线程同步问题,在计算机科学和软件工程中有着广泛的应用。这个问题的核心在于如何在多个线程之间有效地共享有限的资源,确保数据的一致性和避免竞争条件。在这个例子中,我们将深入...
在解压缩后的"proandcom"文件中,可能包含了进一步的代码示例或详细的解释,你可以查看这些文件以加深对生产者消费者问题的理解。同时,为了优化性能和避免死锁,编写多线程程序时,需要遵循良好的设计原则,例如...
这个简单的例子展示了如何使用C++的同步原语来解决生产者-消费者问题。然而,在实际应用中,可能需要考虑更多的细节,比如加入退出条件、异常处理、资源管理等。此外,还可以使用信号量(semaphores)来替代条件变量...
总的来说,这个例子深入浅出地演示了C#中如何利用多线程和同步机制实现生产者与消费者的经典模型,这对于理解和应用多线程编程,尤其是解决并发问题有着重要的参考价值。通过这种方式,我们可以构建高效、安全的多...
本文将深入探讨如何在Windows Forms(WindForm)应用程序中实现多生产者消费者模式,以及如何利用.NET框架中的线程安全机制来确保数据的正确性和程序的稳定性。 首先,我们要理解生产者消费者模式的基本概念。这是...