Thread::startVirtualThread 作为 Threadfactory

问题描述 投票:0回答:1

为什么这段代码会导致

java.lang.IllegalThreadStateException

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

java.util.concurrent.ThreadFactory
的 JavaDoc 明确指出:

按需创建新线程的对象。

...并且

Thread::startVirtualThread
是一个
Function<Runnable, Thread>
(对象),应该执行此操作。对吗?

我认为预期的方式可能是

Thread.ofVirtual().factory()
,但我仍然不知道为什么其他功能不起作用。

java multithreading virtual-threads java-23
1个回答
0
投票

ThreadFactory
newThread
方法的 JavaDoc 说道:

构造一个新的未启动线程来运行给定的可运行对象。

关键是unstarted,这意味着

Thread.getState
返回
Thread.State.NEW

Thread.startVirtualThread
创建一个新的虚拟线程并立即开始运行它。所以线程状态不会是
NEW
.

ThreadPoolExecutor
中的代码检查工厂返回的线程的状态,如果不是NEW,则抛出
IllegalThreadStateException

© www.soinside.com 2019 - 2024. All rights reserved.