Java tutorial
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.Future; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class Main { public static void main(String[] args) throws Exception { BlockingQueue<Runnable> blockingQueue = new ArrayBlockingQueue<Runnable>(48); ThreadPoolExecutor testExecutor = new ThreadPoolExecutor(6, 10, 1, TimeUnit.SECONDS, blockingQueue); List<Future<String>> futures = new ArrayList<>(); for (int i = 0; i < 20; i++) { Future<String> testFuture = testExecutor.submit(new MyCallable(i)); futures.add(testFuture); } for (Future<String> testFuture : futures) { System.out.println("Output Returned is : " + testFuture.get()); } } } class MyCallable implements Callable<String> { int id; public MyCallable(int id) { this.id = id; } @Override public String call() throws Exception { System.out.println("Running " + this.id); return "Called " + this.id; } }