You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Thread::startVirtualThread作为ThreadFactory会抛出IllegalThreadStateException?

问题

调用以下代码时会抛出java.lang.IllegalThreadStateException,请问原因是什么?

newSingleThreadScheduledExecutor(Thread::startVirtualThread).scheduleWithFixedDelay(
   () -> System.out.println("Hello, World!"),
   0,
   1,
   TimeUnit.SECONDS
);

java.util.concurrent.ThreadFactory的JavaDoc明确说明:“An object that creates new threads on demand.”,而Thread::startVirtualThread是一个Function<Runnable, Thread>,按说应该能完成创建线程的工作,这是为什么?已知正确用法是Thread.ofVirtual().factory(),但不清楚前者失效的原因。

原因分析
  • Thread::startVirtualThread违背了ThreadFactory的核心约定:
    ThreadFactory的newThread(Runnable r)方法要求仅创建线程但不启动,线程的启动控制权必须交给线程池。但Thread::startVirtualThread的逻辑是直接创建虚拟线程并立即启动它,返回的线程已经处于RUNNABLE状态。
  • 线程池的状态校验触发异常:
    线程池在拿到ThreadFactory创建的线程后,会尝试启动它。但此时虚拟线程已经被启动过一次,根据Java线程的规则,线程只能被启动一次,因此触发IllegalThreadStateException。
  • Thread.ofVirtual().factory()的合理性:
    这个工厂实现严格遵守ThreadFactory的约定:创建虚拟线程后不会立即启动,而是把启动操作交给线程池执行,线程池可以正常管理线程的调度和生命周期,不会出现重复启动的问题。

内容的提问来源于stack exchange,提问作者xtay2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 02:18:10