5. 阻塞队列解决生产者与消费者问题

有三个组成部分:缓冲区、生产者、消费者

生产者负责往缓冲区添加数据,消费者负责往缓冲区消耗数据,如何保证运行的时候使得生产者在缓冲区满时不添加数据,消费者在缓存空时不消费数据,这样的一个问题,就是生产者消费者问题

Demo 代码实现

使用阻塞队列实现:

生产者:

class Producer extends Thread {
    BlockingQueue<String> buffer;

    public Producer(BlockingQueue<String> buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            this.buffer.put("product");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Producer is producing...");
    }
}

消费者:

class Consumer extends Thread {
    BlockingQueue<String> buffer;

    public Consumer(BlockingQueue<String> buffer) {
        this.buffer = buffer;
    }

    @Override
    public void run() {
        try {
            this.buffer.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("Consumer is consuming...");
    }
}

Demo 测试:

class ProducerConsumerDemo {
    public static void main(String[] args) {
        BlockingQueue<String> buffer = new ArrayBlockingQueue<>(5);
        for (int i = 0; i < 6; i++) {
            new Producer(buffer).start();
        }
        for (int i = 0; i < 8; i++) {
            new Consumer(buffer).start();
        }
        for (int i = 0; i < 2; i++) {
            new Producer(buffer).start();
        }
    }
}

结果:

Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Producer is producing...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Consumer is consuming...
Producer is producing...
Consumer is consuming...
Producer is producing...
Consumer is consuming...

可以看见,虽然生产者在并***况下会出现不同步的情况,但缓冲区的结果严格符合两个问题的要求

全部评论

相关推荐

后来123321:别着急,我学院本大二,投了1100份,两个面试,其中一个还是我去线下招聘会投的简历,有时候这东西也得看运气
点赞 评论 收藏
分享
05-07 17:58
门头沟学院 Java
wuwuwuoow:1.简历字体有些怪怪的,用啥写的? 2.Redis 一主二从为什么能解决双写一致性? 3.乐观锁指的是 SQL 层面的库存判断?比如 stock > 0。个人认为这种不算乐观锁,更像是乐观锁的思想,写 SQL 避免不了悲观锁的 4.奖项证书如果不是 ACM,说实话没什么必要写 5.逻辑过期时间为什么能解决缓存击穿问题?逻辑过期指的是什么 其实也没什么多大要改的。海投吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务