`

生产者、消费者(线程Demo)

阅读更多
package com.huawei.nebula.acl.dao.test;
import java.util.ArrayList;
import java.util.List;

/**
* 商品队列类 生产和消费
*
* @author lKF22533
*
*/
public class ProductQueue {
// 队列最大值
private int maxCount;
// 队列
private List<Product> list;

public ProductQueue() {
super();
// TODO Auto-generated constructor stub
}

public ProductQueue(int maxCount) {
super();
this.maxCount = maxCount;
list = new ArrayList<Product>(maxCount);
}

/**
* 生产
*/
public synchronized void production(Product product) {
while (isFull()) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.list.add(product);
System.out.println(Thread.currentThread().getName()
+ "    商品:   " + product.getId());
notifyAll();
}

/**
* 消费
*/
public synchronized void consume() {
while (isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Product product = list.get(list.size() - 1);
list.remove(product);
System.out.println(Thread.currentThread().getName()
+ "    商品:   " + product.getId());
notifyAll();
}

private boolean isFull() {
if (this.maxCount == list.size()) {
System.out.println("队列已满,准备消费...");
return true;
}
return false;
}

private boolean isEmpty() {
if (list.size() == 0) {
System.out.println("队列已空,准备生产...");
return true;
}
return false;
}
}

package com.huawei.nebula.acl.dao.test;
/**
* main
* @author lKF22533
*
*/
public class ThreadDemo {
public static void main(String[] args) {
ProductQueue queue = new ProductQueue(10);
for (int i = 0; i < 10; i++) {
Production production = new Production(queue);
new Thread(production, "生产线程" + i).start();
}

for (int i = 0; i < 10; i++) {
Consume consume = new Consume(queue);
new Thread(consume, "消费线程" + i).start();

}
}
}

/**
* 生产类
*
* @author lKF22533
*
*/
class Production implements Runnable {
private static int id = 1;
private ProductQueue queue;

public Production(ProductQueue queue) {
super();
this.queue = queue;
}

@Override
public void run() {
while (true) {
Product product = new Product(id++, "product" + id);
queue.production(product);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

/**
* 消费类
*
* @author lKF22533
*
*/
class Consume implements Runnable {
private ProductQueue queue;

public Consume(ProductQueue queue) {
super();
this.queue = queue;
}

@Override
public void run() {
while (true) {
queue.consume();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}

package com.huawei.nebula.acl.dao.test;
/**
* 商品实体类
* @author lKF22533
*
*/
public class Product {
private int id;
private String name;
//get/set
}


分享到:
评论

相关推荐

    java 多线程生产者消费者模型demo

    Java多线程生产者消费者模型是一种典型的线程协作模式,用于解决并发编程中资源的高效利用和同步问题。在这个模型中,"生产者"线程负责生成数据,而"消费者"线程则负责处理这些数据。为了实现这种模式,Java提供了...

    java线程安全以及生产者消费者demo

    而生产者消费者模型是一种设计模式,用于解决资源分配和消耗的问题,它通过共享缓冲区来协调生产者和消费者线程之间的通信。 线程安全主要涉及到以下几个方面: 1. **同步机制**:Java提供了多种同步机制,如`...

    java生产者消费者demo

    在这个"java生产者消费者demo"中,开发者使用了适配器模式来构建解决方案。适配器模式是一种设计模式,它允许不同接口的类协同工作,即使它们原本无法直接交互。在生产者消费者问题中,适配器模式可能被用来协调生产...

    QT/C++多线程练习:单生产者多消费者(源码)

    主线程、生产者线程(一)、消费者管理线程(一)、消费者线程(多),以及一些全局变量。 主线程职责:UI控件的控制和显示、控制生产者:调节生产的速度和暂停与继续、控制消费 生产者线程职责:根据商品数量调控...

    操作系统生产者消费者DEMO

    生产者消费者问题是这样设定的:存在一个共享的有限大小的缓冲区,生产者线程负责生成产品并将其放入缓冲区,而消费者线程则负责从缓冲区取出产品进行消费。关键在于,生产者不能在缓冲区满时继续生产,同样消费者也...

    kafka demo ,两种线程消费方式

    为了在单个消费者实例中利用多线程,我们需要确保所有线程共享相同的消费者实例,而不是创建多个消费者实例。 - **线程安全**:由于多个线程将访问同一个消费者实例,必须确保代码是线程安全的,尤其是在调用`...

    生产者消费者模式+定时任务demo

    在这个"生产者消费者模式+定时任务demo"中,开发者创建了一个示例项目,目的显然是为了深入理解这一设计模式。这个项目中可能包含了以下关键部分: 1. **生产者类(Producer Class)**:生产者负责创建数据并将其放...

    java多线程练习demo 基本的线程使用方式 生产者消费者练习 龟兔赛跑练习.zip

    生产者线程负责向队列中添加元素,而消费者线程则负责取出并处理这些元素。`BlockingQueue`提供了线程安全的插入和移除操作,避免了多线程环境下的数据竞争问题。 然后,我们来看"龟兔赛跑"练习。这是一个基于多...

    kafka demo 两种线程消费方式

    【标题】"Kafka Demo 两种线程消费方式"展示了在Kafka中处理消息的两种常见线程模型,这是理解Kafka消费者工作原理的关键部分。Kafka是一个分布式流处理平台,用于构建实时数据管道和应用,它允许生产者发布消息到...

    C#生成者消费者Demo-winform

    2. **生产者线程**:负责创建或生成数据并将其放入缓冲区。在这个示例中,生产者可能是负责下载网页的线程。 3. **消费者线程**:从缓冲区中取出数据并进行处理。对于这个Winform应用,消费者可能是负责解析和显示...

    Qt中使用QSemaphore,单生产者—多消费者模型

    在多线程编程中,`QSemaphore`常被用来实现生产者-消费者模型,其中生产者线程生产数据,而消费者线程消费数据。这种模型对于并发处理和优化系统性能具有重要意义。 在“Qt中使用QSemaphore,单生产者—多消费者...

    kafka-java-demo 基于java的kafka生产消费者示例

    在"Kafka-java-demo"中,你将看到如何使用这些接口来实现一个简单的生产者和消费者示例。 【Kafka Producer】 Kafka生产者是负责将数据发布到Kafka主题的组件。在Java中,我们可以创建一个Producer实例,配置相关...

    java IBM MQ 7.5.0 生产者和消费者实例

    在实际应用中,生产者和消费者可能需要在多线程环境中运行,以提高吞吐量和响应速度。因此,理解Java的并发机制和线程安全非常重要。 8. **性能优化**: 对于大规模的消息传递,可能需要考虑使用预分配的缓冲区、...

    springMVC+多线程+kafka的 demo基于maven

    在本项目中,我们探索了如何将...而Kafka则作为数据通道,实现数据在生产者和消费者之间的高效传输。通过修改配置文件中的Kafka集群IP地址,这个demo就可以在不同的环境中运行,展示了这三者在实际应用中的集成和作用。

    高并发多线程处理demo-java.rar

    6. **阻塞队列(BlockingQueue)**:在多线程处理中,可能会使用阻塞队列,如`LinkedBlockingQueue`,它允许生产者线程添加任务,而消费者线程在队列为空时会被阻塞,直到有新的任务到来。这样可以确保任务被及时...

    kafka生产消费demo

    总结,这个“kafka生产消费demo”涵盖了Kafka 0.10.2版本的基本使用,包括生产者和消费者的创建、消息的发布与消费,以及可能的多线程处理。了解这些核心概念和API对于理解和构建基于Kafka的数据处理系统至关重要。

    一个可以重用的线程安全生产者消费者队列类

    不过一般的文档中给出的例子往往只是“例子”,要用于实际的项目开发中差的很远,共享一下我以前写的一个线程安全的生产者消费者队列类。具有如下特点: 1.可以设置队列中的最大长度; 2.线程安全; 3.多线程想向...

    多线程互斥锁和条件变量demo

    在实际的多线程编程中,互斥锁和条件变量的组合使用可以解决复杂的同步问题,例如生产者-消费者模型、读写锁等。通过理解并熟练掌握这些概念,你将能够编写出更加高效、可靠的多线程程序。对于初学者来说,分析并...

    JAVA多线程模式高清版+DEMO

    - 生产者-消费者模式:使用`BlockingQueue`实现线程间的生产与消费。 - 线程池模式:通过`ExecutorService`实现线程复用,避免频繁创建销毁线程。 - 单例模式在多线程环境下的应用:确保类只有一个实例,通常使用...

Global site tag (gtag.js) - Google Analytics