import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 
 
public class Main { 
  public static void main(String[] args) { 
    PrintTask task1 = new PrintTask("thread1"); 
    PrintTask task2 = new PrintTask("thread2"); 
    PrintTask task3 = new PrintTask("thread3"); 
 
    System.out.println("Starting threads"); 
 
    ExecutorService threadExecutor = Executors.newCachedThreadPool(); 
 
    threadExecutor.execute(task1); // start task1 
    threadExecutor.execute(task2); // start task2 
    threadExecutor.execute(task3); // start task3 
 
    threadExecutor.shutdown(); // shutdown worker threads 
 
    System.out.println("Threads started, main ends\n"); 
  } 
} 
 
class PrintTask implements Runnable { 
  private int sleepTime; 
 
  private String threadName; 
 
  public PrintTask(String name) { 
    threadName = name; 
    sleepTime = 1000; 
  } 
 
  public void run() { 
    try { 
      System.out.printf("%s going to sleep for %d milliseconds.\n", threadName, sleepTime); 
 
      Thread.sleep(sleepTime); // put thread to sleep 
    } catch (InterruptedException exception) { 
      exception.printStackTrace(); 
    } 
    System.out.printf("%s done sleeping\n", threadName); 
  } 
} 
 
    
  
  |