模型描述:
java线程中典型的生产者与消费者模式,综合运用到thread中的notify()和wait();
仓库Godown的固定的容量大小max_size,同时有多个生产者向仓库生产放他产品,同时又有多个消费都从仓库取出产品,这就涉及到生产和消费过程中的同步问题,利用多线程技术可以很好的解决这个问题
1、生产者模型,定义为一个线程即实现Thread类
package com.leiht.thread.waitnotify;
public class Producer extends Thread {
private int needNum;
private Godown godown;
public Producer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}
@Override
public void run() {
godown.produce(needNum);
}
public int getNeedNum() {
return needNum;
}
public void setNeedNum(int needNum) {
this.needNum = needNum;
}
public Godown getGodown() {
return godown;
}
public void setGodown(Godown godown) {
this.godown = godown;
}
}
2、消费模型
package com.leiht.thread.waitnotify;
public class Consumer extends Thread {
private int needNum;
private Godown godown;
public Consumer(int needNum, Godown godown) {
this.needNum = needNum;
this.godown = godown;
}
@Override
public void run() {
godown.consume(needNum);
}
public int getNeedNum() {
return needNum;
}
public void setNeedNum(int needNum) {
this.needNum = needNum;
}
public Godown getGodown() {
return godown;
}
public void setGodown(Godown godown) {
this.godown = godown;
}
}
仓库模型(核心代码)
package com.leiht.thread.waitnotify;
public class Godown {
public int current_size;
public static final int max_size = 100;
public static int getMaxSize() {
return max_size;
}
public Godown(int current_size) {
this.current_size = current_size;
}
/*
* 生产方法
*/
public synchronized void produce(int needNum) {
//可以生产
if((needNum + current_size) < max_size) {
System.out.println("开始生产");
current_size = current_size + needNum;
System.out.println("生产完成");
notifyAll();
}else { //不能生产 将当前线程挂到this(当前)对象上
try {
System.out.println("当前库存过大,挂起等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
/*
* 消费方法
*/
public synchronized void consume(int needNum) {
if(needNum > current_size) {
try {
System.out.println("当前商品不足,等等待");
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("开始消费");
current_size = current_size - needNum;
System.out.println("结束消费");
notifyAll();
}
}
测试代码
package com.leiht.thread.waitnotify;
public class Test {
public static void main(String[] args) {
Godown godown = new Godown(30);
Consumer c1 = new Consumer(50, godown);
Consumer c2 = new Consumer(20, godown);
Consumer c3 = new Consumer(30, godown);
Producer p1 = new Producer(10, godown);
Producer p2 = new Producer(10, godown);
Producer p3 = new Producer(10, godown);
Producer p4 = new Producer(10, godown);
Producer p5 = new Producer(10, godown);
Producer p6 = new Producer(10, godown);
Producer p7 = new Producer(80, godown);
c1.start();
c2.start();
c3.start();
p1.start();
p2.start();
p3.start();
p4.start();
p5.start();
p6.start();
p7.start();
}
}
分享到:
相关推荐
通过理解和掌握这些知识点,开发者能够有效地实现生产者-消费者模式,解决并发编程中的数据共享和协作问题。在实际项目中,这个模式常用于优化系统性能,尤其是在I/O密集型或计算密集型的应用中。
在Java中,我们可以使用`java.util.concurrent`包中的工具类来实现生产者-消费者模式。`BlockingQueue`接口是最常用的实现方式,它提供了线程安全的数据结构,可以用来作为生产者和消费者之间的缓冲区。例如,我们...
4. **阻塞队列(BlockingQueue)**:Java并发包(java.util.concurrent)中的阻塞队列是实现生产者消费者模式的理想选择。它们在内部已经处理了线程同步和等待,提供了一种高效且安全的共享数据方式。例如,`put()`...
生产者消费者模式是一种经典的多线程同步问题解决方案,它源于现实世界中的生产流水线,用于描述生产者(Producer)和消费者(Consumer)之间的协作关系。在这个模式中,生产者负责生成产品并放入仓库,而消费者则从...
Java线程安全与生产者消费者模型是多线程编程中的两个重要概念,它们在并发处理中扮演着关键角色。在Java中,线程安全是指一个类或者方法在多线程环境下能够正确地处理数据,避免数据的不一致性或竞态条件。而生产者...
Java多线程编程是开发高并发、高性能应用的关键技术之一,而生产者消费者模式是多线程编程中常用的一种设计模式。它通过分离数据的生产和消费过程,实现了线程间的协同工作,有效避免了资源的竞争和浪费。在这个模式...
在Java中,我们可以利用`java.util.concurrent`包中的工具类来实现生产者消费者模式。其中,`BlockingQueue`接口是一个理想的候选,因为它提供了线程安全的数据结构,可以用于线程间的同步。`BlockingQueue`有多种...
生产者和消费者模式是多线程编程中一个经典的设计模式,它主要解决的是在多线程环境下资源的有效利用和同步问题。在这个模式中,生产者负责生成数据,而消费者负责消费这些数据。为了保证生产与消费的平衡以及避免...
java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免线程(特别是消费者线程)因阻塞而无限等待的情况。源码中还简单...
在Java编程中,生产者消费者模式是一种典型的多线程协作模型,用于解决系统资源供需不平衡的问题。这个模式的核心思想是将生产数据和消费数据的过程解耦,使得生产者可以独立地生产数据,而消费者可以独立地消费数据...
Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...
线程池可以配合生产者消费者模式,例如通过提交任务到线程池来实现生产者,线程池中的工作线程充当消费者角色。 在使用生产者消费者模式时,需要注意以下几点: - **线程安全**:确保所有的操作都是线程安全的,...
本例通过Java语言实现了生产者-消费者模式的一个简单示例。具体代码如下: 1. **主类** `ProducerConsumer`:负责初始化存储器、生产者和消费者对象,并启动对应的线程。 - `Storage s = new Storage();`:创建一...
通过这个示例,我们不仅了解了生产者消费者模式,还学习了Java并发编程中`BlockingQueue`接口的使用,以及如何创建和管理线程。这是一个基础但非常实用的例子,有助于理解多线程环境中的同步和协作。在实际应用中,...
Java多线程中的“生产者与消费者”模式是一种...在实际开发中,可以利用Java提供的并发工具类,如`Semaphore`(信号量)、`CountDownLatch`(计数器)等,进一步优化和扩展生产者消费者模型,以适应更复杂的业务需求。
Java中的消费者生产者模式是一种经典的多线程设计模式,它用于解决两个或多个线程间的协同工作问题。在这个模式中,生产者线程负责创建资源,而消费者线程则负责消费这些资源。为了保证线程安全和有效协作,通常会...
生产者消费者模式是一种经典的多线程同步问题解决方案,在Java中有着广泛的应用。它主要用于解决系统中数据处理的并发问题,确保生产者线程与消费者线程之间的协作与数据的有序处理。这种模式遵循一个基本原理:生产...
在实际应用中,Java提供了更高级的并发工具类,如`BlockingQueue`,它已经内置了线程安全和阻塞操作,可以简化生产者与消费者模式的实现,提高代码的可读性和可维护性。例如,我们可以使用`ArrayBlockingQueue`作为...
### Java生产者与消费者模型详解 ...实验过程中,使用Eclipse IDE搭建开发环境,通过编写和调试代码,成功实现了三个生产者与三个消费者之间的数据同步交互,验证了生产者-消费者模式的有效性和可行性。