Thread API
The following use a static factory method to create a virtual thread, invokes its start method to schedule it, and then invokes the join method to wait for thread to terminate.
Thread thread = Thread.newThread(Thread.VIRTUAL, () -> System.out.println("hello"));
thread.start();
thread.join();
The Thread.Builder API can also be used to creates virtual thread. The first example creates a virtual thread but does not start it. The second example creates and start the virtual thread.
Thread thread1 = Thread.builder().virtual().task(() -> System.out.println("hello")).build();
Thread thread2 = Thread.builder().virtual().task(() -> System.out.println("hi")).start();
The Thread.Builder API can also be used to create a ThreadFactory. The ThreadFactory created by the following snippet will create virtual threads named "worker-0", "worker-1", "worker-2", ...
ThreadFactory factory = Thread.builder().virtual().name("worker", 0).factory();
ExecutorService API
TDB
Differences between regular Threads and virtual Threads
Thread API
- The priority of a virtual thread is always NORM_PRIORITY. The priority is not inherited and cannot be changed with the setPriority method.
- Virtual threads are daemon threads and cannot be changed with the setDaemon method.
- Virtual threads cannot be suspend, resumed or stopped with the Thread suspend, resume and stop APIs.
- Virtual threads have no permission when running with a security manager.
- Virtual threads are not active threads in their thread group. The getThreadGroup method returns a ThreadGroup that cannot be destroyed and its enumerate methods do not enumerate the virtual threads in the group.
Networking APIs
If a virtual thread is interrupted when blocked in an I/O operating on a java.net.Socket, ServerSocket or DatagramSocket then it causes IOException to be thrown.