Summary
Virtual threads were a preview feature in Java 19 (JEP 425) and Java 20 (JEP 436). JEP 444 proposes to make Virtual Threads a permanent feature.
There is one change to the API. The preview API to opt-out of thread locals, Thread.Builder.allowSetThreadLocals(boolean)
, has been dropped.
Problem
The goal is to enable server applications written in the simple thread-per-request style to scale. The Motivation section of the JEP provides a lot of discussion on this topic and how some developers workaround the limitation by giving up on the thread-per-request style in favor of thread-sharing and the asynchronous style.
Solution
The following APIs are proposed to be permanent APIs. The @since/equivalent changes to 21 as per guidance in JEP 12.
interface java.lang.Thread.Builder
interface java.lang.Thread.Builder.OfPlatform
interface java.lang.Thread.Builder.OfVirtual
method java.lang.Thread.ofPlatform()
method java.lang.Thread.ofVirtual()
method java.lang.Thread.startVirtualThread()
method java.lang.Thread.isVirtual()
method java.util.concurrent.Executors.newThreadPerTaskExecutor(ThreadFactory)
method java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor()
method com.sun.jdi.ThreadReference.isVirtual()
method com.sun.jdi.request.ThreadStartRequest.addPlatformThreadsOnlyFilter()
method com.sun.jdi.request.ThreadDeathRequest.addPlatformThreadsOnlyFilter()
enum com.sun.management.HotSpotDiagnosticMXBean.ThreadDumpFormat
method com.sun.management.HotSpotDiagnosticMXBean.dumpThreads(String, ThreadDumpFormat)
method jdk.jfr.consumer.RecordedThread.isVirtual()
JNI function IsVirtualThread
JVMTI function SuspendAllVirtualThreads
JVMTI function ResumeAllVirtualThreads
JVMTI event VirtualThreadStart
JVMTI event VirtualThreadEnd
JVMTI capability can_support_virtual_threads
JDWP command ThreadReference/IsVirtual
JDWP modifier EventRequest/Set.PlatformThreadsOnly
The feature includes the following command line options:
jcmd Thread.dump_to_file [-format=json] [-overwrite] file
jdb -trackallthreads
JDWP agent sub option includevirtualthreads=y
The feature includes the following system properties:
jdk.virtualThreadScheduler.parallelism
jdk.virtualThreadScheduler.maxPoolSize
jdk.tracePinnedThreads
jdk.traceVirtualThreadLocals (new)
The feature includes the following file format:
Thread dump JSON format
The feature includes the following Java Flight Recorder events:
jdk.VirtualThreadStart
jdk.VirtualThreadEnd
jdk.VirualThreadPinned
jdk.VirtualThreadSubmitFailed
Specification
API changes - see attached zip file with specdiffs. Changes to highlight:
- Thread.ofVirtual, Thread.startVirtualThread, Executors.newVirtualThreadPerTaskExector, and StructuredTaskExecutor no longer throw UOE
- Thread.Builder.allowSetThreadLocals(boolean), and the overrides of this method in Thread.Builder.OfPlatform and Thread.Builder.OfVirtual, have been dropped
- ThreadLocal.set and Thread.setContextClassLoader no longer throws UOE
- Thread.Builder permits no longer include an implementation class. This is an implementation change but it has the effect of enabling switching over Thread.Builder subclasses exhaustively.
Java Native Interface (JNI) spec:
- Add JNI_VERSION_21 = 0x00150000
- Update GetVersion to return JNI_VERSION_21 on implementations of Java SE 21+
- Change IsVirtualtThread to be permanent and "since" to 21
Java Virtual Machine Tool Interface (JVM TI) spec:
- Add JVMTI_VERSION_21 = 0x30150000
- Change SuspendAllVirtualThreads and ResumeAllVirtualThreads functions to be permanent and "since" to 21
- Change VirtualThreadStart and VirtualThreadEnd events to be permanent and "since" to 21
- Change can_support_virtual_threads capability to be permanent and "since" to 21
Java Debug Wire Protocol spec:
- Change ThreadReference/IsVirtual command to be permanent and "since" to 21
- Change EventRequest Set/PlatformThreadsOnly modifier to be permanent and "since" to 21
- csr of
-
JDK-8304919 Implementation of Virtual Threads
-
- Resolved
-
- relates to
-
JDK-8284169 Implementation of Virtual Threads (Preview)
-
- Closed
-
-
JDK-8296673 Implementation of Virtual Threads (Second Preview)
-
- Closed
-