虚拟线程是轻量级线程,极大地减少了在高并发场景下维护线程池的开销。相比传统的 Platform Thread,虚拟线程不再由操作系统直接调度。
1. 避免 ThreadLocal 滥用:由于虚拟线程的数量可能达到百万量级,过多的 ThreadLocal 会导致严重的内存溢出风险。
2. Pinning 限制:在 synchronized 块内执行 I/O 操作会导致虚拟线程被固定(Pinned)在载体线程上,建议改用 ReentrantLock。
示例代码:
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
IntStream.range(0, 10000).forEach(i -> {
executor.submit(() -> {
Thread.sleep(Duration.ofSeconds(1));
return i;
});
});
}