资讯专栏INFORMATION COLUMN

java之BlockingQueue实现生产者消费者

李义 / 1683人阅读

摘要:直接上代码注意在使用实现生产者消费者模型时候,泛型使用若等对象时候会发现消费者出现异常,这是由于传值和传引用的区别,而由于的自动装箱不会出现此类问题,具体可自行尝试生产者消费者获取失败主线程

直接上代码
注意在使用blockingqueue实现生产者消费者模型时候,BlockingQueue泛型使用若atomic等对象时候会发现消费者出现异常,这是由于传值和传引用的区别,而Integer由于java的自动装箱不会出现此类问题,具体可自行尝试

生产者

public class Pull implements Runnable {

    BlockingQueue pool;

    Integer product = 0;

    public Pull(BlockingQueue pool) {
        this.pool = pool;
    }

    @Override
    public void run() {
        while (true) {
            try {
                pool.put(product);
                System.out.println("add:" + product);
                product++;
            } catch (InterruptedException e) {
                System.out.println("add failed");
                e.printStackTrace();
            }

            if (product == 20){
                break;
            }

        }
    }
}

消费者

public class Push implements Runnable{

    BlockingQueue pool;

    public Push(BlockingQueue pool) {
        this.pool = pool;
    }

    @Override
    public void run() {

        while(true) {
            try {
                Integer tmp = pool.take();
                System.out.println("take:" + tmp);
            } catch (InterruptedException e) {
                System.out.println("获取失败");
                e.printStackTrace();
            }
        }
    }
}

主线程

public class MyExecutor {
    public static void main(String[] args) {
        BlockingQueue queue = new LinkedBlockingDeque<>(10);
        Thread thread = new Thread(new Push(queue));
        Thread thread1 = new Thread(new Pull(queue));
        thread1.start();
        thread.start();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68276.html

相关文章

  • Java多线程进阶(三一)—— J.U.Ccollections框架:BlockingQueue

    摘要:和方法会一直阻塞调用线程,直到线程被中断或队列状态可用和方法会限时阻塞调用线程,直到超时或线程被中断或队列状态可用。 showImg(https://segmentfault.com/img/bVbgyPy?w=1191&h=670); 本文首发于一世流云专栏:https://segmentfault.com/blog... 一、引言 从本节开始,我们将介绍juc-collectio...

    entner 评论0 收藏0
  • 解读 Java 并发队列 BlockingQueue

    摘要:如果队列已满,这个时候写操作的线程进入到写线程队列排队,等待读线程将队列元素移除腾出空间,然后唤醒写线程队列的第一个等待线程。数据必须从某个写线程交给某个读线程,而不是写到某个队列中等待被消费。 前言 本文直接参考 Doug Lea 写的 Java doc 和注释,这也是我们在学习 java 并发包时最好的材料了。希望大家能有所思、有所悟,学习 Doug Lea 的代码风格,并将其优雅...

    maochunguang 评论0 收藏0
  • java高并发从零到放弃(五)

    摘要:前言这篇主要来讲解多线程中一个非常经典的设计模式包括它的基础到拓展希望大家能够有所收获生产者消费者模式简述此设计模式中主要分两类线程生产者线程和消费者线程生产者提供数据和任务消费者处理数据和任务该模式的核心就是数据和任务的交互点共享内存缓 前言 这篇主要来讲解多线程中一个非常经典的设计模式包括它的基础到拓展希望大家能够有所收获 生产者-消费者模式简述 此设计模式中主要分两类线程:生产者...

    meislzhua 评论0 收藏0
  • BlockingQueue学习

    摘要:引言在包中,很好的解决了在多线程中,如何高效安全传输数据的问题。同时,也用于自带线程池的缓冲队列中,了解也有助于理解线程池的工作模型。 引言 在java.util.Concurrent包中,BlockingQueue很好的解决了在多线程中,如何高效安全传输数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。同时,BlockingQueue也用于...

    xuhong 评论0 收藏0

发表评论

0条评论

李义

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<