首页 > 其他分享 >阻塞队列(二十四)

阻塞队列(二十四)

时间:2022-09-26 21:57:27浏览次数:66  
标签:Thread 队列 阻塞 queue 线程 二十四 new BlockingQueue

BlockingQueue

image

阻塞队列(BlockingQueue) 是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。

  • 解决线程通信的问题。
  • 阻塞方法: put、take。

put方法,用于向队列中存入数据,当队列已满时,该方法将阻塞
take方法,用于从队列中获取数据,当队列已空时,该方法将阻塞

生产者消费者模式

  • 生产者:产生数据的线程。
  • 消费者:使用数据的线程。

实现类

  • ArrayBlockingQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue、SynchronousQueue、DelayQueue等。

代码示例

import java.util.Random;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;

public class BlockingQueueTests {

    public static void main(String[] args) {
        BlockingQueue queue = new ArrayBlockingQueue(10);
        new Thread(new Producer(queue)).start();
        new Thread(new Consumer(queue)).start();
        new Thread(new Consumer(queue)).start();
        new Thread(new Consumer(queue)).start();
    }

}

// 生产者
class Producer implements Runnable {

    private BlockingQueue<Integer> queue;

    public Producer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            // 生产数据
            for (int i = 0; i < 100; i++) {
                Thread.sleep(20);
                queue.put(i);
                System.out.println(Thread.currentThread().getName() + "生产:" + queue.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

// 消费者
class Consumer implements Runnable {

    private BlockingQueue<Integer> queue;

    public Consumer(BlockingQueue<Integer> queue) {
        this.queue = queue;
    }

    @Override
    public void run() {
        try {
            while (true) {
                Thread.sleep(new Random().nextInt(1000));
                queue.take();
                System.out.println(Thread.currentThread().getName() + "消费:" + queue.size());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

参考文章:
BlockingQueue(阻塞队列)

标签:Thread,队列,阻塞,queue,线程,二十四,new,BlockingQueue
From: https://www.cnblogs.com/dalelee/p/16732524.html

相关文章

  • CAP事件总线在NetCore中的应用+MySql存储队列信息
    上一篇链接:https://www.cnblogs.com/fei686868/p/16721769.html在上一篇中,我们介绍了CAP基于内存存储的应用。本篇我们介绍下,把存储做到mysql中,队列还是使用内存队列。my......
  • RabbitMQ 死信队列和延时队列
    RabbitMQ死信队列和延时队列TTL(TimeToLive)消息的TTL就是消息的存活时间RabbitMQ中对队列、消息都可以设置TTL对队列设置TTL,就是队列没有消费者连着的保留时间;对消......
  • [Oracle] LeetCode 253 Meeting Rooms II 优先队列
    Givenanarrayofmeetingtimeintervalsintervalswhereintervals[i]=[starti,endi],returntheminimumnumberofconferenceroomsrequired.Solution我们用......
  • 阿里巴巴-《码出高效》-任务队列实际应用
    Java项目开发中处理一些复杂的计算任务时,很多时候不使用同步的处理方式,而是使用异步多线程的方式来进行处理,并且会使用到Java中的任务队列。本篇文章就来讲讲任务队列......
  • JS执行队列
    JS执行队列同步和异步同步前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。比如做饭的同步做法:我们要烧水煮饭,等水开了(10分......
  • 组合日记-九月二十四日
    前带系数的二项式系数的处理\(\displaystyle\sum_{k\ge0}{\binom{n+k}{m+2k}}\binom{2k}{k}\frac{(-1)^k}{k+1}\)\(\displaystyle\binom{n+k}{m+2k}\)的处理很巧妙。......
  • 队列的模拟及环形队列思路
    定义队列是一个有序列表,可以用数组或是链表来实现。遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出模拟思路队列本身是有序列表,若使用数组的......
  • 【代码片段】Qt6.2.4 QProcess使用(打开外部程序,运行命令,同步、阻塞方式)
    参考https://blog.csdn.net/qq_38232598/article/details/100745552https://www.cnblogs.com/lsgxeva/p/12641707.htmlQProcess类QProcess类是Qt中专门用于启动一个......
  • 简单的队列转发服务器
    废话不说先上代码#项目是转发服务器,针对新手fromtypingimportOptionalfromflaskimportFlask,requestimportredis,queue,time,requestsapp=Flask(__na......
  • BM42 用两个栈实现队列
    描述用两个栈来实现一个队列,使用n个元素来完成n次在队列尾部插入整数(push)和n次在队列头部删除整数(pop)的功能。队列中的元素为int类型。保证操作合法,即保证pop操......