|  
 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);
 }
 }
 
 
 
 |