With Java 21 the `java.lang.Thread` API was updated with the methods `.ofVirtual` and `.ofPlatform` which return two different implementations 
of the new `Thread.Builder` interface, which can be used to instantiate virtual or platform threads with a builder pattern.


== Why is this an issue?

While this can be useful, whenever we want to instantiate and start an unnamed virtual thread, there is a more convenient static method to do so: `Thread.startVirtualThread(Runnable task)`

This rule raises an issue every time the form `Thread.ofVirtual().start(task);` is found.

== How to fix it

=== Code examples

==== Noncompliant code example

[source,java]
----
Thread virtualThread = Thread.ofVirtual().start(task); // Noncompliant `Thread.startVirtualThread` should be used instead
----

==== Compliant solution

[source,java]
----
Thread virtualThread = Thread.startVirtualThread(task); // Compliant
Thread unstartedVirtualThread = Thread.ofVirtual().unstarted(task); // Compliant, the thread is unstarted
Thread namedVirtualThread = Thread.ofVirtual().name("MyThread").start(); // Compliant, the builder pattern is being used to set the name 
Thread platformThread = Thread.ofPlatform().start(task); // Compliant, there is no `Thread.startPlatformThread` method
----


== Resources

=== Documentation

* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Thread.Builder.html[Thread.Builder]

* Java Documentation - https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Thread.html#startVirtualThread(java.lang.Runnable)[Thread.startVirtualThread]
