# 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() 不同