$ java ThreadDumpPinnedDemo &
pid=7126
done

$ jcmd <pid> Thread.dump_to_file -format=json threaddump.json    (taken mid-flight)
7126:
Created /home/claude/java-core-examples/vt-pinning/target/threaddump.json

--- the two virtual thread entries from that dump ---
{
  "tid": "22",
  "time": "2026-09-30T06:32:51.489994627Z",
  "virtual": true,
  "name": "",
  "state": "TIMED_WAITING",
  "stack": [
    "java.base/jdk.internal.misc.Unsafe.park(Native Method)",
    "java.base/java.lang.VirtualThread.parkOnCarrierThread(VirtualThread.java:822)",
    "java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:801)",
    "java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:983)",
    "java.base/java.lang.Thread.sleepNanos(Thread.java:507)",
    "java.base/java.lang.Thread.sleep(Thread.java:540)",
    "com.ankurm.vtpinning.ThreadDumpPinnedDemo.sleepCallback(ThreadDumpPinnedDemo.java:22)",
    "com.ankurm.vtpinning.ThreadDumpPinnedDemo.blockingNativeCall(Native Method)",
    "java.base/java.lang.VirtualThread.run(VirtualThread.java:460)"
  ],
  "carrier": "23"
}

{
  "tid": "24",
  "time": "2026-09-30T06:32:51.490322496Z",
  "virtual": true,
  "name": "",
  "state": "TIMED_WAITING",
  "stack": [
    "java.base/java.lang.VirtualThread.parkNanos(VirtualThread.java:787)",
    "java.base/java.lang.VirtualThread.sleepNanos(VirtualThread.java:983)",
    "java.base/java.lang.Thread.sleepNanos(Thread.java:507)",
    "java.base/java.lang.Thread.sleep(Thread.java:540)",
    "com.ankurm.vtpinning.ThreadDumpPinnedDemo.lambda$main$0(ThreadDumpPinnedDemo.java:34)",
    "java.base/java.lang.VirtualThread.run(VirtualThread.java:460)"
  ]
}

