【面试问题】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();
    }
}
相关文章
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
16天前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
22天前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
18天前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
41 4
|
19天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
68 4
|
1月前
|
存储 安全 算法
Java面试题之Java集合面试题 50道(带答案)
这篇文章提供了50道Java集合框架的面试题及其答案,涵盖了集合的基础知识、底层数据结构、不同集合类的特点和用法,以及一些高级主题如并发集合的使用。
96 1
Java面试题之Java集合面试题 50道(带答案)
|
1月前
|
存储 Java 程序员
Java面试加分点!一文读懂HashMap底层实现与扩容机制
本文详细解析了Java中经典的HashMap数据结构,包括其底层实现、扩容机制、put和查找过程、哈希函数以及JDK 1.7与1.8的差异。通过数组、链表和红黑树的组合,HashMap实现了高效的键值对存储与检索。文章还介绍了HashMap在不同版本中的优化,帮助读者更好地理解和应用这一重要工具。
55 5
|
30天前
|
存储 Java
[Java]面试官:你对异常处理了解多少,例如,finally中可以有return吗?
本文介绍了Java中`try...catch...finally`语句的使用细节及返回值问题,并探讨了JDK1.7引入的`try...with...resources`新特性,强调了异常处理机制及资源自动关闭的优势。
22 1
|
1月前
|
Java 程序员
Java 面试高频考点:static 和 final 深度剖析
本文介绍了 Java 中的 `static` 和 `final` 关键字。`static` 修饰的属性和方法属于类而非对象,所有实例共享;`final` 用于变量、方法和类,确保其不可修改或继承。两者结合可用于定义常量。文章通过具体示例详细解析了它们的用法和应用场景。
30 3
|
1月前
|
Java
Java面试题之cpu占用率100%,进行定位和解决
这篇文章介绍了如何定位和解决Java服务中CPU占用率过高的问题,包括使用top命令找到高CPU占用的进程和线程,以及使用jstack工具获取堆栈信息来确定问题代码位置的步骤。
110 0
Java面试题之cpu占用率100%,进行定位和解决

热门文章

最新文章

下一篇
无影云桌面