import java.lang.foreign.*;
import java.lang.invoke.*;


public class Test implements Runnable{

  private static final MethodHandle hndSleep;

  private final int num;

  static{
    var linker = Linker.nativeLinker();
    var func = linker.defaultLookup()
                     .find("sleep")
                     .get();
    var desc = FunctionDescriptor.of(ValueLayout.JAVA_INT, ValueLayout.JAVA_INT);
    hndSleep = linker.downcallHandle(func, desc);
  }

  public Test(int num){
    this.num = num;
  }

  @Override
  public void run(){
    System.out.println("Thread started: " + num);
    try{
      hndSleep.invoke(3600);
    }
    catch(Throwable t){
      throw new RuntimeException(t);
    }
  }

  public static void main(String[] args) throws Exception{
    for(int i = 0; i < 10; i++){
      Thread.ofVirtual().start(new Test(i));
      //Thread.ofPlatform().start(new Test(i));
    }
    System.out.println("All vthreads have been started");
    Thread.sleep(3600_000);
  }

}
