为何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
相关产品推荐
相关产品推荐

