多线程消费者和制造者的金典案例!!

public class Clerk {

private int product=0;//产品默认0;

//生产者生成出来的产品交给店员

public synchronized void addProduct(){

if(this.product>=20){

try {

wait();//产品已满,请稍等在生产

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}else{

product++;

System.out.println("生产者生产地"+product+"个产品。");

notifyAll(); //通知等待区的消费者今天取产品了

}

}

//消费者从店员处取产品

public synchronized void getProduct(){

if(this.product<=0){

try {

wait();//产品没有货了,请稍等再取

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

}else{

System.out.println("消费者取走了第"+product+"个产品");

product--;

notifyAll();//通知等待区的生成者可以生产 产品

}

}

}

//消费者线程要执行的任务

public class Consumer implements Runnable {

private Clerk cl;

public Consumer(Clerk cl) {

this.cl=cl;

}

public void run() {

System.out.println("消费者开始取走产品!");

while(true){

try {

Thread.sleep((int)(Math.random()*10)*100);

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

cl.getProduct();//取走产品

}

}

}

//生产者线程要执行的任务

public class Producer implements Runnable {

private Clerk cl;

public Producer(Clerk cl){

this.cl=cl;

}

public void run() {

System.out.println("生产者开始生产产品!");

while(true){

try {

Thread.sleep((int)(Math.random()*10)*100);

} catch (InterruptedException e) {

// TODO 自动生成的 catch 块

e.printStackTrace();

}

cl.addProduct();//生产产品

}

}

}

public class Main {

public static void main(String[] args) {

// TODO 自动生成的方法存根

Clerk cl=new Clerk();

Thread prt=new Thread(new Producer(cl));//生产者线程

Thread cot=new Thread(new Consumer(cl));//消费者线程

prt.start();

cot.start();

}

}

时间: 2024-08-09 23:16:02

多线程消费者和制造者的金典案例!!的相关文章

[Java Concurrent] 多线程合作 producer-consumers / queue 的简单案例

在多线程环境下,通过 BlockingQueue,实现生产者-消费者场景. Toast 被生产和消费的对象. ToastQueue 继承了 LinkedblockingQueue ,用于中间存储 Toast . Producer 生产 Toast ,并将生产出来的 Toast 放进队列 initialToastQ 中. Processor 加工 Toast,从 initialToastQ 中获得生产出来的 Toast,将其加工并放进队列 finishedToast 中. Consumer 消费

多线程 网络编程 文件上传案例多线程

Day13 多线程 3).多线程的好处: 提高程序的运行效率,提高用户的体验度. 创建新的线程: *    定义类继承Thread *    重写方法run *    创建Thread子类的对象 *    调用子类对象的方法 start() * *  为什么继承Thread *    Thread类是线程对象类 *    继承了Thread,子类也是线程对象 * *  为什么重写run *    Sun工程师,不清楚其他人员用线程做什么 *    全部写在run中 * *  为什么调用start

spring boot 集成kafka (多线程,消费者使用kafka的原生api实现,因为@KakfkaListener修改groupId无效)

application-test.properties 1 #kafka 2 kafka.consumer.zookeeper.connect=*:2181 3 kafka.consumer.servers=*:9092 4 kafka.consumer.enable.auto.commit=true 5 kafka.consumer.session.timeout=6000 6 kafka.consumer.auto.commit.interval=1000 7 #保证每个组一个消费者消费同一

基于多线程的TCP socket通信经典案例

服务器端 package com.thinkvenus.study.socket; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintWriter; import java.net.Socket; /** *

Java多线程产生死锁的一个简单案例

synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象:2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象:3. 修改一个静态方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象:4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对

线程安全的生产者消费者四种实现方法

问题描述 在IT技术面试过程中,我们经常会遇到生产者消费者问题(Producer-consumer problem), 这是多线程并发协作问题的经典案例.场景中包含三个对象,生产者(Producer),消费者(Consumer)以及一个固定大小的缓冲区(Buffer).生产者的主要作用是不断生成数据放到缓冲区,消费者则从缓冲区不断消耗数据.该问题的关键是如何线程安全的操作共享数据块,保证生产者线程和消费者线程可以正确的更新数据块,主要考虑 1. 生产者不会在缓冲区满时加入数据. 2. 消费者应当

iOS多线程开发——NSThread浅析

在IOS开发中,多线程的实现方式主要有三种,NSThread.NSOperation和GCD,我前面博客中对NSOperation和GCD有了较为详细的实现,可以参考<iOS多线程开发--NSOperation/NSOperationQueue浅析><iOS多线程开发--GCD的使用与多线程开发浅析>.以及对于多线程中的同步异步,并行串行等概念,我在<GCD实践--串行队列/并发队列与iOS多线程详解>中也有较为详细的讲解.为了学习的完整性,今天我们主要从代码层面来实现

多线程程序设计学习(2)之single threaded execution pattern

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

【原创】Kafka Consumer 多线程 实例

Kafka 0.9版本开始推出了Java版本的consumer,优化了coordinator的设计以及摆脱了对zookeeper的依赖.社区最近也在探讨正式用这套consumer API替换Scala版本的consumer的计划.鉴于目前这方面的资料并不是很多,本文将尝试给出一个利用KafkaConsumer编写的多线程消费者实例,希望对大家有所帮助. 这套API最重要的入口就是KafkaConsumer(o.a.k.clients.consumer.KafkaConsumer),普通的单线程使