Virtual Threads 深入

共 28 题
#

1. 虚拟线程下仍需用信号量/连接池限制并发的资源(DB 连接、下游配额)的原因

A DB 连接、下游配额等有界资源仍需并发控制,虚拟线程只解决线程数瓶颈 ✓ 正确答案
B 虚拟线程会占用大量线程资源
C 虚拟线程不需要任何资源限制
D 连接池在虚拟线程下无效
#

2. 虚拟线程与 ReentrantLock 的协作

A 虚拟线程在 ReentrantLock 上阻塞时会钉住载体线程
B ReentrantLock 在虚拟线程下会死锁
C 虚拟线程不能使用 ReentrantLock
D 虚拟线程在 ReentrantLock 上阻塞时会被挂起,释放载体线程去执行其他任务 ✓ 正确答案
#

3. 虚拟线程在 CompletableFuture 的链路

A CompletableFuture 不能使用虚拟线程执行器
B 可将虚拟线程执行器传入 CompletableFuture,使异步任务在独立虚拟线程上运行 ✓ 正确答案
C CompletableFuture 只使用 commonPool
D 虚拟线程与 CompletableFuture 无法协作
#

4. 虚拟线程在 Netty 的协作

A 虚拟线程可让 Netty handler 中的阻塞操作不阻塞事件循环线程 ✓ 正确答案
B 虚拟线程只能用于非阻塞 I/O
C Netty 无法使用虚拟线程
D Netty 的事件循环本身是虚拟线程
#

5. 虚拟线程在 Spring Boot 4.x 的虚拟线程启用

A 设置 spring.threads.virtual.enabled=true 即可让容器与执行器使用虚拟线程 ✓ 正确答案
B 虚拟线程无法在 Spring Boot 中启用
C 启用虚拟线程需要改业务代码
D 虚拟线程只支持 Tomcat
#

6. 虚拟线程在 Tomcat/Jetty/Undertow Servlet 容器(Spring Boot 3.2+)

A Servlet 容器不支持虚拟线程
B Spring Boot 3.2+ 可通过配置让 Tomcat/Jetty/Undertow 用虚拟线程处理请求 ✓ 正确答案
C 虚拟线程只用于异步 Servlet
D 容器虚拟线程会减少并发
#

7. 虚拟线程的 mount/unmount 与栈管理

A 虚拟线程的栈保存在 OS 线程栈上
B 虚拟线程不能挂起
C 虚拟线程挂起时栈保存到堆中的 Continuation 对象,载体线程可执行其他虚拟线程 ✓ 正确答案
D mount/unmount 不会释放载体线程
#

8. 虚拟线程的 pinning 在 synchronized 块 vs ReentrantLock 下的不同表现(JEP 491 前后)

A JEP 491 后 synchronized 仍会钉住载体线程
B pinning 只影响 ReentrantLock
C ReentrantLock 在虚拟线程下会钉住
D JEP 491 让 synchronized 在虚拟线程阻塞时也不再钉住载体线程 ✓ 正确答案
#

9. 虚拟线程的异常处理与 JDK 25 结构化并发(StructuredTaskScope)

A 虚拟线程的异常无法被捕获
B 结构化并发会吞掉所有异常
C StructuredTaskScope 通过子任务收集结果与异常,并支持 ShutdownOnFailure/ShutdownOnSuccess 策略 ✓ 正确答案
D 异常只能由系统处理
#

10. 虚拟线程的栈结构(Continuation)在 JDK 25 中的内存占用与 ForkJoinPool 调度细节

A 虚拟线程的栈固定为 1MB
B Continuation 栈动态增长、内存占用小,虚拟线程由 ForkJoinPool 工作窃取调度 ✓ 正确答案
C 虚拟线程只由单线程调度
D 虚拟线程不用栈
#

11. 虚拟线程与 JNI(Native)的限制

A 虚拟线程调用 JNI 时不会钉住载体线程
B 虚拟线程不能调用任何原生代码
C JNI 与虚拟线程完全兼容
D 虚拟线程调用阻塞 JNI 方法会钉住载体线程,JEP 472 对此发出警告 ✓ 正确答案
#

12. 虚拟线程与平台线程的内存占用对比

A 平台线程栈比虚拟线程栈更省内存
B 平台线程栈是固定预留的,虚拟线程栈按需动态分配 ✓ 正确答案
C 虚拟线程数量受 OS 线程数限制
D 虚拟线程栈固定为 1MB
#

13. 虚拟线程在数据库连接池的边界(HikariCP 虚拟线程兼容)

A 虚拟线程可绕过连接池限制
B 虚拟线程获取连接阻塞时会被挂起不钉住,但连接池仍是有界资源,需配置池大小与超时 ✓ 正确答案
C HikariCP 不支持虚拟线程
D 虚拟线程不影响连接池
#

14. 虚拟线程的 Thread.ofVirtual() 工厂方法与 Executors.newVirtualThreadPerTaskExecutor() 的差异与协作

A 两者功能完全相同
B ofVirtual 只能创建平台线程
C newVirtualThreadPerTaskExecutor 复用固定线程
D ofVirtual 创建单个虚拟线程,newVirtualThreadPerTaskExecutor 为每个任务创建虚拟线程,适合批量与执行器迁移 ✓ 正确答案
#

15. 虚拟线程的载体线程(Carrier Thread)机制

A 每个虚拟线程独占一个载体线程
B 载体线程数量无限
C 载体线程是执行虚拟线程的平台线程,可复用执行多个虚拟线程 ✓ 正确答案
D 虚拟线程直接运行在 CPU 上
#

16. 虚拟线程的阻塞 I/O 如何在 JDK 层面挂起(socket/file/锁),哪些原生阻塞无法挂起

A 所有阻塞 I/O 都能被挂起
B 原生阻塞也能被挂起
C JDK 管理的 socket/锁/睡眠可挂起,JNI 原生阻塞无法挂起会钉住载体线程 ✓ 正确答案
D 虚拟线程不能执行阻塞 I/O
#

17. 虚拟线程在 JDK Flight Recorder 的诊断事件

A JFR 没有虚拟线程事件
B 虚拟线程事件无法配置
C JFR 只能监控平台线程
D JFR 提供 VirtualThreadStart/Pinned/End 等事件诊断虚拟线程 ✓ 正确答案
#

18. 虚拟线程的 Thread.sleep 与调度

A 虚拟线程 sleep 时钉住载体线程
B 虚拟线程 sleep 时被挂起,释放载体线程,睡眠结束后重新调度 ✓ 正确答案
C 虚拟线程不能 sleep
D sleep 会阻塞整个 JVM
#

19. 虚拟线程的 Thread.start/Thread.join 语义

A 虚拟线程 join 会阻塞 OS 线程
B 虚拟线程不能 join
C 虚拟线程的 start/join 轻量且可挂起,提倡用结构化并发替代裸 join ✓ 正确答案
D join 不支持超时
#

20. -Djdk.tracePinnedThreads 与 JFR 排查 pinning 的完整流程(watch/trace 事件)

A -Djdk.tracePinnedThreads 打印钉住栈,JFR 的 VirtualThreadPinned 事件用于生产采样,两者结合定位 ✓ 正确答案
B -Djdk.tracePinnedThreads 在生产期打印钉住位置,JFR 事件用于开发期
C 无法定位 pinning
D JEP 491 后 pinning 完全消失
#

21. JEP 491(Synchronize Virtual Threads without Pinning,JDK 24 标准)

A JEP 491 移除了 synchronized
B JEP 491 让虚拟线程在 synchronized 上阻塞时不再钉住载体线程 ✓ 正确答案
C JEP 491 只影响 ReentrantLock
D JEP 491 在 JDK 21 转正
#

22. JFR 的 jdk.VirtualThreadPinned 事件的 threshold 配置与生产环境采样策略

A threshold 越低越好,无性能影响
B 通过 threshold 控制钉住时长阈值,生产环境应采样式启用避免开销 ✓ 正确答案
C 该事件无法配置
D 生产环境应始终禁用
#

23. newVirtualThreadPerTaskExecutor 与固定线程池在吞吐与资源上的差异(吞吐量模型)

A 固定线程池的吞吐不受线程数限制
B 两者资源占用相同
C 虚拟线程吞吐必然低于固定线程池
D 虚拟线程执行器在阻塞 I/O 场景吞吐不受线程数限制,但受 CPU 与有界资源约束 ✓ 正确答案
#

24. 虚拟线程的调试与线程转储(jcmd Thread.dump_to_file 的虚拟线程视图)

A jcmd 无法转储虚拟线程
B jcmd Thread.dump_to_file 支持虚拟线程视图,可查看虚拟线程栈与状态 ✓ 正确答案
C 线程转储只能显示平台线程
D 虚拟线程无法调试
#

25. 虚拟线程(Virtual Threads,JEP 444)的 ForkJoinPool 调度

A 虚拟线程由单线程调度
B 虚拟线程不用线程池
C ForkJoinPool 用工作窃取机制调度虚拟线程,默认 parallel 线程数等于 CPU 核数 ✓ 正确答案
D 载体线程数无限
#

26. JEP 491 修复同步块钉住后,虚拟线程 pinning 的残留边界(原生方法/JNI 阻塞)与官方建议

A JEP 491 后 pinning 完全消失
B 原生阻塞也能被挂起
C JNI 原生阻塞仍会钉住载体线程,官方建议隔离或迁移到 FFM ✓ 正确答案
D 残留边界只有 synchronized
#

27. 虚拟线程与 Pin 检测的 JFR 事件

A JFR 的 VirtualThreadPinned 事件记录钉住时长、线程与堆栈,用于生产监控 ✓ 正确答案
B JFR 无法检测钉住
C Pin 检测事件无法配置
D 钉住事件只在开发期出现
#

28. 虚拟线程的 getId 与 threadId(JDK 25)

A 虚拟线程 ID 从 1 开始
B 虚拟线程 ID 可能为 0 或负数,threadId() 与 getId() 等价 ✓ 正确答案
C 虚拟线程没有 ID
D threadId() 与 getId() 不同