import java.time.Duration;
import java.util.concurrent.ThreadFactory;
import java.util.stream.IntStream;

public class VirtualThreadScaleExample {

    private static final ThreadFactory THREAD_FACTORY = Thread
            .ofVirtual() //.ofPlatform()
            .name("Andy's-custom-factory-",0)
            .factory();

    public static void main(String[] args) {
        System.out.println("Inside main");
        final VirtualThreadScaleExample varThreadExample = new VirtualThreadScaleExample();
        IntStream.range(0, 1_000_000).forEach(

                counter -> THREAD_FACTORY.newThread(() -> varThreadExample.simpleWork(counter)).start()
        );
        try {
            Thread.sleep(Duration.ofSeconds(12));
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        System.out.println("End main");
    }

    private void simpleWork(int counter) {
        System.out.println("Start " + Thread.currentThread().getName());
        try {
            System.out.println("Is virtual thread ? \n"+ (Thread.currentThread().isVirtual() ? "Yes " : "No ") + counter);
            Thread.sleep(Duration.ofSeconds(1));
            System.out.println("End " +Thread.currentThread().getName());
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
    }
}