简介: CSDN博客专家、《Android系统多媒体进阶实战》一书作者
博主新书推荐:《Android系统多媒体进阶实战》🚀
Android Audio工程师专栏: Audio工程师进阶系列【原创干货持续更新中……】🚀
Android多媒体专栏: 多媒体系统工程师系列【原创干货持续更新中……】🚀
推荐1:车载系统实战课:AAOS车载系统+AOSP14系统攻城狮入门视频实战课 🚀
推荐2:HIDL与AIDL实战课:Android14 Binder之HIDL与AIDL通信实战课 🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
🌻1. 前言
本篇目的:Java线程安全队列之SynchronousQueue:用法实例
🌻2. Java线程安全队列SynchronousQueue介绍
-
基本概念
SynchronousQueue是零容量阻塞队列,每个插入必须等待对应移除,实现直接移交。 -
功能
提供put、take、offer、poll,支持公平/非公平策略,无内部缓冲。 -
使用限制
容量始终为0,插入与移除必须配对,不接受null元素。 -
性能特性
无锁直接移交,延迟极低,适合高并发传递。 -
使用场景
线程池工作队列、实时交换、流水线传递。
🌻3. 代码实例
🌻3.1 使用SynchronousQueue实现线程间直接传递
-
应用场景
一对一移交数据。 -
用法实例
import java.util.concurrent.*; public class DirectDemo { public static void main(String[] args) throws InterruptedException { SynchronousQueue<String> q = new SynchronousQueue<>(); new Thread(() -> { try { q.put("data"); } catch (InterruptedException ignored) {} }).start(); System.out.println(q.take()); } }
输出:
data
🌻3.2 使用SynchronousQueue作为线程池工作队列
-
应用场景
Cached线程池直接移交任务。 -
用法实例
import java.util.concurrent.*; public class PoolDemo { public static void main(String[] args) { ExecutorService pool = new ThreadPoolExecutor(0, 10, 60, TimeUnit.SECONDS, new SynchronousQueue<>()); pool.execute(() -> System.out.println("run")); pool.shutdown(); } }
输出:
run
🌻3.3 使用SynchronousQueue实现实时交换
-
应用场景
双线程实时交换对象。 -
用法实例
import java.util.concurrent.*; public class ExchangeDemo { public static void main(String[] args) throws InterruptedException { SynchronousQueue<Integer> q = new SynchronousQueue<>(); new Thread(() -> { try { q.put(42); } catch (InterruptedException ignored) {} }).start(); new Thread(() -> { try { System.out.println(q.take()); } catch (InterruptedException ignored) {} }).start(); } }
输出:
42
🌻3.4 线程安全队列SynchronousQueue总结
关键词 | 功能描述 | 典型应用 |
---|---|---|
SynchronousQueue | 零容量直接移交 | 线程池、实时交换、流水线 |
put | 阻塞等待接收方 | 无缓冲生产 |
take | 阻塞等待交付方 | 无缓冲消费 |
fair | 公平策略 | 顺序传递 |