- Virtual threads always report their priority as NORM_PRIORITY. The priority is not inherited and cannot be changed with the setPriority method.
- Virtual threads are daemon threads. Their daemon status cannot be changed with the setDaemon method.
- Virtual threads cannot be suspended, resumed or stopped with the Thread suspend, resume and stop APIs.
- Virtual threads have no permissions when running with a security manager.
- Virtual threads are not active threads in a thread group. All virtual threads are in the same thread group, the group cannot be selected when creating a virtual thread. The ThreadGroup enumerate methods do not enumerate the virtual threads in the group.
Debuggers and tools using the Java Debug Interface API observe the following differences:
- com.sun.jdi.VirtualMachine::allThreads enumerates platform threads only, the list does not include mirrors for virtual threads.
- Virtual threads are not live threads in a thread group so ThreadGroupReference::threads only lists platform threads.
- ThreadStartRequest/ThreadDeathRequest request notifications of thread start/termination of platform threads by default. Tools have to opt-in to get start/death events for virtual threads (by invoking the removeVirtualThreadFilter method on the event request.
As a temporary measure to support existing IDEs/debugger releases, the JDWP agent tracks virtual threads so that VirtualMachine::allThreads and ThreadGroupReference::threads will enumerate virtual threads. This is not a scalable solution and highly unsuited to environments where a debugger is attached to a running VM.