其实生产者和消费者模式概念很简单,就是生产者将生产出来的产品放在仓库里,然后消费者依次从仓库里取产品消费。归到程序里,这里的仓库就可以用数组,队列或栈来表示。
掌握以下两点后,该模式的实现将不成问题。
1. 首先要明白生产者和消费者之间的并发对象就是存放产品的队列,这样才能把并发方法提炼出来。
2. 其次要掌握object.wait()和object.notifyAll()这两个方法的基本使用模式:
synchronized (object) {
//条件不成立时,则等待
while(条件不成立){
try {
object.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//需要同步的代码
object.notifyAll();
}
示例1:使用LinkedList实现的FIFO方式的生产者和消费者模式,若要改为先进后出的栈方式,只需把(1)处得注释打开,替换上一语句即可。
package productor.consumer.demo.self;
import java.util.LinkedList;
public class ProductorConsumerDemo {
public static void main(String[] args) {
Queue<IPhone> queue = new Queue<IPhone>();
new Thread(new Productor("生产者1" , queue)).start();
new Thread(new Consumer("消费者1" , queue)).start();
}
}
class IPhone{
private int id;
private String name;
public IPhone(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "{id:" + id + ",name=" + name + "}";
}
}
//FIFO队列
class Queue<T>{
private static final int DEFAULT_SIZE = 8; //定义队列的默认大小
int size ; //定义队列的大小
private LinkedList<T> list = new LinkedList<T>();
public Queue() {
super();
this.size = DEFAULT_SIZE;
}
public Queue(int size) {
super();
this.size = (size <=0 ? DEFAULT_SIZE : size);
}
public synchronized void put(T t){
while(list.size() >= size){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
list.addLast(t);
System.out.println("生产了:" + t);
this.notifyAll();
}
public synchronized T get(){
while(list.size() <= 0){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
T t = list.removeFirst();
//先进后出--同栈 t = list.removeLast(); ----(1)
System.out.println("消费了:" + t);
return t;//FIFO
}
}
//生产者
class Productor implements Runnable{
private String name;
private Queue queue;
public Productor(String name,Queue queue) {
super();
this.name = name;
this.queue = queue;
}
@Override
public void run() {
for(int i=0;i<10;i++){
IPhone iPhone = new IPhone(i,"name-" + i);
queue.put(iPhone);
try {
Thread.sleep((int) (Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//消费者
class Consumer implements Runnable{
private String name;
private Queue queue;
public Consumer(String name,Queue queue) {
super();
this.name = name;
this.queue = queue;
}
@Override
public void run() {
for(int i=0;i<10;i++){
IPhone iPhone = (IPhone) queue.get();
try {
Thread.sleep((int) (Math.random() * 200));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
这种模式在生产者消费者问题、读写锁等多线程设计中非常常见。 总结一下,`Object.wait()`、`Object.notify()`和`Object.notifyAll()`是Java多线程编程中的关键工具,它们用于控制线程的同步和通信。使用时,必须...
`Buffer`类中的`put()`和`take()`方法使用`synchronized`关键字保证了线程安全,并使用`wait()`和`notifyAll()`来控制生产者和消费者的执行顺序。 在`Main`类中,我们创建了两个线程,一个作为生产者,另一个作为...
通过这样的设计,我们可以有效地控制生产者和消费者的执行顺序,确保了数据的正确性,并且避免了先消费后生产的情况。在实际应用中,可能需要根据具体需求进行优化,例如添加异常处理、使用更高级的同步工具(如`...
在实际开发中,除了使用synchronized和wait/notify外,还可以利用Java并发库提供的高级工具,如`ExecutorService`,`CountDownLatch`,`CyclicBarrier`等,来更优雅地实现生产者消费者模型。例如,可以使用`...
在`JThreadSynch`这个压缩包文件中,我们可以预见到包含的Java源代码将展示以上的一种或多种机制,通过具体的示例代码来解释和实现生产者消费者问题的线程同步和互斥。通过学习和理解这个示例,开发者可以更好地掌握...
在Java中实现生产者-消费者模型,主要依赖于线程同步机制,包括`wait()`, `notify()` 和 `notifyAll()` 方法,它们都是在 `Object` 类中定义的。这些方法配合 `synchronized` 关键字使用,可以确保线程安全地访问...
- **线程间通信**:在多线程环境中实现线程间的同步和通信,比如生产者消费者模式。 - **条件变量**:通常用于实现更复杂的同步控制逻辑,例如基于条件的等待或信号量。 #### 四、两者区别总结 - **所属类**:`...
在一个典型的生产者与消费者模型中,存在两个角色:生产者和消费者。生产者负责生成数据并将这些数据放入共享缓冲区中,而消费者则负责从该缓冲区中取出数据并进行处理或消费。这个过程涉及到对共享资源的访问和管理...
【生产者消费者模式】是一种经典的多线程设计模式,用于解决资源的共享和并发访问问题。在该模式中,生产者负责创建产品并放入共享的缓冲区,而消费者则从缓冲区取出产品进行消费。这种模式的核心是确保生产者与消费...
消费者与生产者问题是多线程编程中的一个经典案例,它主要涉及到线程间...综上所述,消费者与生产者问题是理解线程同步和协作的关键实例,通过学习和实践这一问题,我们可以更好地掌握Java并发编程中的核心概念和技术。
总的来说,使用`Lock`和`Condition`实现的生产者消费者模式相比传统的`synchronized`和`wait()`/`notify()`,在代码可读性、灵活性和性能上都有所提升。这使得开发者能够更高效、更可控地处理并发问题。在JDK 5.0...
总结来说,"JAVA_生产者-消费者"是一个经典的并发编程模型,它利用Java的线程同步机制和`BlockingQueue`接口来实现高效的数据交换。理解并熟练掌握这一模式对于开发高并发、高性能的Java应用至关重要。通过学习和...
生产者消费者问题是多线程编程中的经典模型,用于展示如何在并发环境中协调生产者和消费者之间的数据处理。在这个问题中,生产者线程负责生成数据,而消费者线程则负责消费这些数据。Java语言提供了丰富的工具来解决...
5. **设计模式**:生产者消费者模型可以看作是一种“生产者-消费者”设计模式的实例,它属于行为设计模式,用于协调异步处理和共享资源。此外,还可以结合观察者模式,让消费者订阅生产者,当有新数据时,生产者通知...
综上所述,"os生产者消费者实验(c#)"的实现涉及到了操作系统中的并发控制、线程同步和多线程编程等知识点。在C#中,我们可以通过`System.Threading`提供的工具来构建一个安全、高效的生产者-消费者模型,实现数据...
6. **死锁与活锁**:在实现生产者消费者模式时,需要警惕死锁和活锁的情况。死锁是指两个或多个线程相互等待对方释放资源,导致无法继续执行。活锁则是线程不断地尝试获取资源但总是失败,从而陷入无限循环。正确的...
在多线程编程中,正确使用`wait()`, `notify()` 和 `notifyAll()` 能够帮助开发者创建复杂的并发控制机制,如生产者-消费者问题、读写锁等。然而,这些方法的使用需要特别小心,因为它们可能导致死锁、饥饿或者其他...
Object类wait及notify方法原理实例解析 Object类中的wait和notify方法是Java多...Object类中的wait和notify方法是Java多线程编程中最重要的同步机制之一,它们可以用来实现生产者和消费者模式,以及其他的同步机制。
Java中实现生产者消费者模式有多种方式,下面将详细介绍两种方式:使用synchronized和Object的wait和notifyAll方法,使用jdk1.8的Lock和Condition。 方式一:使用synchronized和Object的wait和notifyAll方法 在...
在Java中,`wait()`、`notify()`和`notifyAll()`是实现生产者消费者模型的关键方法,它们都定义在`java.lang.Object`类中。`wait()`方法使得当前线程进入等待状态,释放它持有的锁,直到其他线程调用同一对象上的`...