package com.interview.multithreaded; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.Callable; import java.util.concurrent.CompletionService; import java.util.concurrent.ExecutorCompletionService; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ThreadPoolExample { private static BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10); public static ExecutorService threadPool = Executors.newFixedThreadPool(5); public void doWork() throws Exception{ CompletionService<String> completionService = new ExecutorCompletionService<String>(threadPool); List<Future<String>> futureList = new ArrayList<Future<String>>(); for(int i=0; i < 20; i++){ futureList.add(completionService.submit(new Count10(i))); } for(int i=0; i < 20; i++){ Future<String> future = completionService.take(); System.out.println(future.get()); } } public static void main(String args[]) throws Exception{ ThreadPoolExample tpe = new ThreadPoolExample(); tpe.doWork(); } } class Count10 implements Callable<String>{ private int index = 0; Count10(int i){ index = i; } @Override public String call() throws Exception { // for(int i=0; i < 10; i++){ int sleepTime = 5000 + 1; try { System.out.println("Before sleep " + index); Thread.sleep(sleepTime); System.out.println("After sleep " + index); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // } return "Done" + index; } }