首页 > 编程语言 >阻塞队列(java)

阻塞队列(java)

时间:2024-08-07 21:28:20浏览次数:15  
标签:java Thread 队列 阻塞 value 线程 new

阻塞队列(BlockingQueue)是一个线程安全的队列,支持阻塞的插入和移除操作。它常用于生产者-消费者问题等多线程环境中。

以下是一个简单的 Java 实现,展示了如何使用 BlockingQueue 来实现一个基本的阻塞队列示例

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

public class BlockingQueueExample {
    
    // 创建一个容量为 10 的阻塞队列
    private static final BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10);

    public static void main(String[] args) {
        // 启动生产者线程
        Thread producer = new Thread(new Producer());
        producer.start();

        // 启动消费者线程
        Thread consumer = new Thread(new Consumer());
        consumer.start();
    }

    static class Producer implements Runnable {
        @Override
        public void run() {
            int value = 0;
            try {
                while (true) {
                    queue.put(value);
                    System.out.println("Produced: " + value);
                    value++;
                    Thread.sleep(1000); // 模拟生产过程的时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    static class Consumer implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    Integer value = queue.take();
                    System.out.println("Consumed: " + value);
                    Thread.sleep(1500); // 模拟消费过程的时间
                }
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }
}

 

代码说明:

  1. 创建阻塞队列

    • ArrayBlockingQueue 是一种基于数组的阻塞队列,容量为 10。
  2. 生产者线程

    • Producer 类实现了 Runnable 接口,负责将数据放入队列中。使用 queue.put(value) 方法将元素添加到队列,如果队列已满,则会阻塞,直到队列中有空间。
  3. 消费者线程

    • Consumer 类也实现了 Runnable 接口,负责从队列中取出数据。使用 queue.take() 方法从队列中取出元素,如果队列为空,则会阻塞,直到队列中有元素。
  4. 启动线程

    • 在 main 方法中启动生产者和消费者线程,以便它们并发运行。

运行结果:

生产者将生成的整数放入队列中,消费者从队列中取出并消费这些整数。生产者和消费者通过阻塞队列进行数据交换,这样即使生产速度和消费速度不同,也能保证数据的正确传递。

标签:java,Thread,队列,阻塞,value,线程,new
From: https://blog.csdn.net/2301_79075954/article/details/141001444

相关文章

  • Java跨平台原理
    Java跨平台的原理主要基于以下几个关键点:Java虚拟机(JVM)Java虚拟机是Java跨平台的核心技术。它是一个软件程序,可以在不同的操作系统上运行Java程序,并把Java程序翻译成可执行代码。JVM是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现。不同平台上的JVM......
  • 基于java+ssm+vue的自驾游拼团微信小程序
    ......
  • 【Java】NIO-从入门到精通-Netty先修课-全网最全-综合案例分析
    XiaoYongCai2024/8/6一:AboutByteBuffer1.ByteBuffer用法在JavaNIO中,Buffer是一个用于存储特定基本类型数据的容器,ByteBuffer是最常用的Buffer类型,用于存储字节序列。以下是ByteBuffer的读写操作分析:A.Buffer的基本属性capacity:缓冲区的容量,即可以存储的最大数......
  • java
    类变量方法区、永久代、元空间的区别方法区,是《JVM规范》定义的,所有虚拟机必须有的。PermGenspace则是HotSpot虚拟机基于《JVM规范》对方法区的一个落地实现。针对HotSpot虚拟机,JDK7及之前,PermGenspace就是方法区。JDK8及之后,PermGenspace被移......
  • java反射机制
    反射的原理Java反射机制概述JavaReflection(1)Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于ReflectionAPI取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。(2)加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Cl......
  • Nginx反向代理,代理H5前端 ,java后端,使用服务器+finalshell+vpn
    使用前确认已经安装好nginx,这里我使用的是普通的nginx,注意不是Docker版本的nginx输入nginx-t查询一下,自己的nginxconfig.nginx在那个包下,方便查询 使用catnginx.conf命令,进入需要配置的conf中(这个是我使用的server[server{listen82;s......
  • [Javascript] Proper Tail Calls
    Docs:https://webkit.org/blog/6240/ecmascript-6-proper-tail-calls-in-webkit//*ThisisarecursivefunctionwithoutPTC*/functionfatorial(n){if(n===0){return1}else{returnn*fatorial(n-1)}}console.log(fator......
  • 是你的java二叉树啊啊啊
    1.二叉树的最大深度问题:计算二叉树的最大深度(或高度)。Java实现:publicclassTreeNode{intval;TreeNodeleft;TreeNoderight;TreeNode(intx){val=x;}}publicclassSolution{publicintmaxDepth(TreeNoderoot){if(root==......
  • JavaSE基础知识分享(三)相关练习题
    写在前面大家前面的面向对象部分学的怎么样了,快来看看这些题你能不能快速地写出答案,面向对象在Java中是非常重要的,快来检测你的薄弱点在哪,及时查漏补缺!使用面向对象思想编写下列题目:1.使用面向对象的思想,编写自定义描述狗的信息。设定属性包括:品种,年龄,心情,名字;方法包括:叫,跑。......
  • [Java基础]内存泄漏和内存溢出
    在Java中,内存泄漏(MemoryLeak)和内存溢出(MemoryOverflow)是两种不同的内存管理问题。内存泄漏(MemoryLeak):内存泄漏指的是程序在运行过程中,因为某些原因导致不再使用的对象仍然被保留在内存中,无法被垃圾回收器回收。这些对象会占用内存空间,导致系统的可用内存不断减少,最终可......