import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import org.junit.Test;

public class JI9040484 {

	@Test 
	public void executorServiceTest() { 
		ExecutorService executor = Executors.newFixedThreadPool(2); 

		List<Callable<Void>> tasks = new ArrayList<>(); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 1"); Thread.sleep(500); return null; }) ); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 2"); Thread.sleep(500); return null; }) ); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 3"); Thread.sleep(500); return null; }) ); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 4"); Thread.sleep(500); return null; }) ); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 5"); Thread.sleep(500); return null; }) ); 
		tasks.add((( Callable<Void>) () -> { System.out.println("callable 6"); Thread.sleep(500); return null; }) ); 

		Thread executorInvokerThread = new Thread( () -> { 
			try { 
				executor.invokeAll(tasks); 
			} catch (Exception e) { 
				e.printStackTrace(); 
			} 

			System.out.println("invokeAll returned"); 
		}); 
		executorInvokerThread.start(); 

		try { 
			Thread.sleep(800); 
		} catch (InterruptedException e1) { 
			e1.printStackTrace(); 
		} 


		System.out.println("ShutdownNow"); 
		executor.shutdownNow(); 
		try { 
			executor.awaitTermination(2, TimeUnit.MINUTES); 
		} catch (InterruptedException e) { 
			e.printStackTrace(); 
		} 

		System.out.println("Shutdown complete"); 
		try { 
			executorInvokerThread.join(50000); 
		} catch (InterruptedException e) { 
			e.printStackTrace(); 
		} 
	} 

}
