21xrx.com
2024-12-23 00:14:04 Monday
登录
文章检索 我的文章 写文章
JAVA中常用的阻塞队列有哪些?附带代码案例解析
2023-06-14 16:11:09 深夜i     --     --
JAVA 阻塞队列 多线程

在多线程编程中,阻塞队列是一种非常重要的工具,它能够在多线程协作时有效地进行数据的交换和共享。JAVA中,阻塞队列是一个非常常用的类,它提供了多个阻塞队列的实现,开发者可以选择适合自己需求的队列进行使用。本文将介绍JAVA中常用的阻塞队列类型,并附带代码案例对其进行解析。

1. ArrayBlockingQueue

ArrayBlockingQueue是一个基于数组的阻塞队列,它的容量是有限的,即一旦队列满了,再往队列里添加元素时会阻塞线程,直到队列中有空格子可以使用。同样的,当队列为空时,从队列中取走元素的操作也会被阻塞,直到队列中有元素为止。下面是一个简单的ArrayBlockingQueue使用案例:


import java.util.concurrent.ArrayBlockingQueue;

public class ArrayBlockingQueueTest {

  public static void main(String[] args) throws InterruptedException {

    ArrayBlockingQueue queue = new ArrayBlockingQueue<>(5);

    queue.put("a");

    queue.put("b");

    queue.put("c");

    queue.put("d");

    queue.put("e");

    queue.put("f"); // 队列已满,此时会阻塞线程

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take()); // 队列为空,此时会阻塞线程

  }

}

2. LinkedBlockingQueue

LinkedBlockingQueue是一个基于链表的阻塞队列,它的容量是可以无限扩展的,所以当向队列中添加元素时,一般不会出现阻塞的情况。不过,当从队列中取走元素时,如果队列为空,依然会出现阻塞的情况。下面是一个简单的LinkedBlockingQueue使用案例:


import java.util.concurrent.LinkedBlockingQueue;

public class LinkedBlockingQueueTest {

  public static void main(String[] args) throws InterruptedException {

    LinkedBlockingQueue queue = new LinkedBlockingQueue<>(5);

    queue.put("a");

    queue.put("b");

    queue.put("c");

    queue.put("d");

    queue.put("e");

    queue.put("f"); // 队列没有限制,不会阻塞线程

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take());

    System.out.println(queue.take()); // 队列为空,此时会阻塞线程

  }

}

3. SynchronousQueue

SynchronousQueue是一种不存储元素的阻塞队列,它的每个插入操作必须等待另一个线程的删除操作,反之亦然。要想使用SynchronousQueue类,必须将其放在一个线程中,不然会一直出现阻塞状态。下面是一个简单的SynchronousQueue使用案例:


import java.util.concurrent.SynchronousQueue;

public class SynchronousQueueTest {

  public static void main(String[] args) throws InterruptedException {

    SynchronousQueue queue = new SynchronousQueue<>();

    new Thread(() -> {

      try {

        System.out.println(queue.take()); // 取走元素时会阻塞线程

      } catch (InterruptedException e) {

        e.printStackTrace();

      }

    }).start();

    queue.put("hi"); // 添加元素时会阻塞线程

  }

}

三个

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复