【面试问题】Java 中的阻塞队列用过哪些?

简介: 【1月更文挑战第27天】【面试问题】Java 中的阻塞队列用过哪些?

在 Java 中,阻塞队列(Blocking Queue)是一种特殊的队列实现,它具有阻塞操作的特性,能够在队列为空或满时使线程阻塞。阻塞队列在多线程编程中广泛应用,用于线程之间的安全通信和协调。Java 提供了一些标准的阻塞队列实现:

1. ArrayBlockingQueue:

ArrayBlockingQueue 是一个基于数组结构的有界阻塞队列。它的大小在创建时就指定,并且不可动态改变。在队列满时,尝试插入元素的线程将被阻塞;在队列空时,尝试取出元素的线程将被阻塞。

importjava.util.concurrent.ArrayBlockingQueue;
importjava.util.concurrent.BlockingQueue;
publicclassArrayBlockingQueueExample {
publicstaticvoidmain(String[] args) {
BlockingQueue<String>blockingQueue=newArrayBlockingQueue<>(5);
// 生产者线程newThread(() -> {
try {
blockingQueue.put("Element 1");
blockingQueue.put("Element 2");
// ...            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
// 消费者线程newThread(() -> {
try {
Stringelement=blockingQueue.take();
// 处理元素            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
    }
}

2. LinkedBlockingQueue:

LinkedBlockingQueue 是一个基于链表结构的有界或无界阻塞队列。如果创建时指定了容量,则为有界队列;如果未指定容量,则为无界队列。在队列满时,尝试插入元素的线程将被阻塞;在队列空时,尝试取出元素的线程将被阻塞。

importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.LinkedBlockingQueue;
publicclassLinkedBlockingQueueExample {
publicstaticvoidmain(String[] args) {
BlockingQueue<String>blockingQueue=newLinkedBlockingQueue<>(5);
// 生产者线程newThread(() -> {
try {
blockingQueue.put("Element 1");
blockingQueue.put("Element 2");
// ...            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
// 消费者线程newThread(() -> {
try {
Stringelement=blockingQueue.take();
// 处理元素            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
    }
}

3. PriorityBlockingQueue:

PriorityBlockingQueue 是一个支持优先级的无界阻塞队列。元素插入队列时按照优先级进行排序,具有最高优先级的元素将被优先取出。不同于 ArrayBlockingQueueLinkedBlockingQueuePriorityBlockingQueue 不要求队列元素实现 Comparable 接口,也可以通过构造函数传入 Comparator 来指定排序规则。

importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.PriorityBlockingQueue;
publicclassPriorityBlockingQueueExample {
publicstaticvoidmain(String[] args) {
BlockingQueue<String>blockingQueue=newPriorityBlockingQueue<>();
// 生产者线程newThread(() -> {
blockingQueue.put("Element 1");
blockingQueue.put("Element 2");
// ...        }).start();
// 消费者线程newThread(() -> {
try {
Stringelement=blockingQueue.take();
// 处理元素            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
    }
}

4. DelayQueue:

DelayQueue 是一个支持延迟元素的无界阻塞队列。元素只有在其指定的延迟时间过后才能被消费。该队列内的元素必须实现 Delayed 接口。

importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.DelayQueue;
importjava.util.concurrent.Delayed;
importjava.util.concurrent.TimeUnit;
publicclassDelayQueueExample {
staticclassDelayedElementimplementsDelayed {
privateStringdata;
privatelongdelayTime;
DelayedElement(Stringdata, longdelayTime) {
this.data=data;
this.delayTime=System.currentTimeMillis() +delayTime;
        }
@OverridepubliclonggetDelay(TimeUnitunit) {
returnunit.convert(delayTime-System.currentTimeMillis(), TimeUnit.MILLISECONDS);
        }
@OverridepublicintcompareTo(Delayedo) {
returnLong.compare(this.delayTime, ((DelayedElement) o).delayTime);
        }
    }
publicstaticvoidmain(String[] args) {
BlockingQueue<DelayedElement>blockingQueue=newDelayQueue<>();
// 生产者线程newThread(() -> {
blockingQueue.put(newDelayedElement("Element 1", 5000));
blockingQueue.put(newDelayedElement("Element 2", 10000));
// ...        }).start();
// 消费者线程newThread(() -> {
try {
DelayedElementelement=blockingQueue.take();
// 处理元素            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
    }
}

5. LinkedTransferQueue:

LinkedTransferQueue 是一个无界阻塞队列,它结合了 LinkedBlockingQueueSynchronousQueue 的特点。它支持普通的 FIFO 队列操作,同时还可以作为一个异步传输队列。

importjava.util.concurrent.BlockingQueue;
importjava.util.concurrent.LinkedTransferQueue;
publicclassLinkedTransferQueueExample {
publicstaticvoidmain(String[] args) {
BlockingQueue<String>blockingQueue=newLinkedTransferQueue<>();
// 生产者线程newThread(() -> {
blockingQueue.offer("Element 1");
blockingQueue.offer("Element 2");
// ...        }).start();
// 消费者线程newThread(() -> {
try {
Stringelement=blockingQueue.take();
// 处理元素            } catch (InterruptedExceptione) {
e.printStackTrace();
            }
        }).start();
    }
}
相关文章
|
14天前
|
Java 程序员
java线程池讲解面试
java线程池讲解面试
30 1
|
1月前
|
消息中间件 NoSQL 网络协议
Java面试知识点复习​_kaic
Java面试知识点复习​_kaic
|
4天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
27 0
|
13天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
45 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
17天前
|
Java 程序员 API
java1.8常考面试题
在Java 1.8版本中,引入了很多重要的新特性,这些特性常常成为面试的焦点
41 8
|
22天前
|
NoSQL Java 关系型数据库
整理Java面试题
整理Java面试题
|
23天前
|
安全 算法 Java
Java 并发编程 面试题及答案整理,最新面试题
Java 并发编程 面试题及答案整理,最新面试题
80 0
|
23天前
|
存储 算法 安全
Java 面试题及答案整理,最新面试题
Java 面试题及答案整理,最新面试题
77 1
|
23天前
|
消息中间件 Dubbo Java
互联网 Java 工程师1000道面试题(485页)
互联网 Java 工程师1000道面试题(485页)
24 0
|
29天前
|
缓存 Java 关系型数据库
Java开发面试题 | 2023
Java开发面试题 | 2023