IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java实现多线程中生产者、消费者问题,简单易懂 -> 正文阅读

[大数据]Java实现多线程中生产者、消费者问题,简单易懂

思想:

1、生产者在while循环里不停地生产“产品”,每生产一个,就交给店员,店员就得到一个产品

2、消费者在while循环里不停地消费产品,每消费一个,店员就移走一个产品

3、店员手里的产品少于20个,就从生产者那里拿走产品。等于20个,就停止从生产者那里拿走产品

4、店员手里的产品多于0个,就让消费者消费产品。等于0个,就停止让消费者消费产品

?

生产者:

生产者在while循环里不停地生产“产品”,每生产一个,就交给店员,店员就得到一个产品

//生产者
class Producter implements Runnable{
    Clerk clerk;
    Producter(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
            //此处可加sleep,让生产者生产的慢一点
            clerk.getProduce();//生产者不停地生产产品,生产一个,就交给店员,店员就get一个
        }
    }
}

消费者:

消费者在while循环里不停地消费产品,每消费一个,店员就移走一个产品

//消费者
class Consummer implements Runnable{
    Clerk clerk;
    Consummer(Clerk clerk){
        this.clerk=clerk;
    }
    @Override
    public void run() {
        while (true){
           //此处可加sleep,让消费者消费的慢一些
            clerk.removeProduce();//消费者不停地消费产品,消费一个,店员处就remove一个
        }
    }
}

店员:

店员手里的产品少于20个,就从生产者那里拿走产品。等于20个,就停止从生产者那里拿走产品

店员手里的产品多于0个,就让消费者消费产品。等于0个,就停止让消费者消费产品

//店员
class Clerk{

    public int producenumber;//店员手里产品的数量

    public synchronized void getProduce() {//锁是clerk,反复执行的实际上是该方法和removeProduce方法
        if(producenumber<20){//店员手里产品数量少于20个,就从生产者那里拿过来一个
            producenumber++;
            System.out.println(Thread.currentThread().getName()+"生产了第"+producenumber+"个产品");
            notify();//已经从生产者那里拿过来一个产品了,说明手里肯定是有产品的,店员可以让消费者拿走产品了
        }else{
            try {
                wait();//店员手里产品数量多于20个,停止从生产者那里拿走产品
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
        }
    }
    public synchronized void removeProduce(){//锁是clerk,相当于四个线程一个一个的执行
        if(producenumber>0){//店员手里产品数量多余0个,就让消费者拿走产品
            System.out.println(Thread.currentThread().getName()+"消费了第"+producenumber+"个产品");
            producenumber--;
            notify();//已经让消费者拿走了一个产品,说明柜台肯定有位置放产品,店员可以从生产者那里取产品了
        }else{
            try {
                wait();//店员手里产品数量少于0个,停止让消费者拿走产品
            } catch (InterruptedException e) {
                System.out.println(e.getMessage());
            }
        }
    }
}

测试类:

public class ThreadCommunicationTest {
    public static void main(String[] args) {
        Clerk clerk=new Clerk();

        Producter p=new Producter(clerk);
        Thread tp1=new Thread(p);
        tp1.setName("生产者1");
        tp1.start();
        Thread tp2=new Thread(p);
        tp2.setName("生产者2");
        tp2.start();

        Consummer c=new Consummer(clerk);
        Thread tc1=new Thread(c);
        tc1.setName("消费者1");
        tc1.start();
        Thread tc2=new Thread(c);
        tc2.setName("消费者2");
        tc2.start();
    }
}

Attention:

一共有四个线程:生产者1、生产者2、消费者1、消费者2

生产者1和生产者2线程开启后,调用Producter类里的run方法,又在run方法里调用Clerk类里的getProduce方法

相当于生产者1和生产者2反复执行的是getProduce方法

生产者1和生产者2线程开启后,调用PConsummer类里的run方法,又在run方法里调用Clerk类里的removeProduce方法

相当于消费者1和消费者2反复执行的是removeProduce方法

而getProduce方法和removeProduce方法都是同步方法,它们都在Clerk类中定义,而Clerk类从始至终只有一个对象,所以两个同步方法的锁是同一把,即Clerk类的实例对象clerk

意味着在两个方法中,四个线程只能一个一个的执行,因此线程安全

执行截图:

?

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-02-03 01:16:27  更:2022-02-03 01:17:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 13:38:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码