import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.IntStream;

public class ThreadName {
   // Atomic integer containing the next thread ID to be assigned
   private static final AtomicInteger nextId = new AtomicInteger(0);

   // Thread local variable containing each thread's ID
   private static final ThreadLocal<Integer> threadId =
       new ThreadLocal<Integer>() {
           @Override protected Integer initialValue() {
               return nextId.getAndIncrement();
       }
   };

   // Returns the current thread's unique ID, assigning it if necessary
   public static int get() {
       return threadId.get();
   }

 
  public static void main(String[] args) {
    System.out.println("Hello, this is main method");
    IntStream.range(0, 10).forEach(i -> {
       var t = new Thread(()-> {
        System.out.println(ThreadName.get());
      });
       
      t.start();
      try {
        t.join();
      } catch (InterruptedException e) {
        //
      }
    });
    System.out.println("And we're at the end.");
  }
}
