ExecutorService.submit(<callable>) taking more time?
concurrency, java, java.util.concurrent
Solution
If you task in Callable is to small, you won't get benefits from concurrency due task switching and overhead for initialisation. Try to add more heavier loop in callable, say 1000000 iterations, and you can see difference
Problem
I am trying to understand the utilities in `java.util.concurrent` package and learnt that we can submit `callable` objects to the `ExecutorService`, which returns `Future`, which is filled with the value returned by the `callable`, after successful completion of task within `call()` method. I am understanding that all the callables are executed concurrently using multiple threads. When I wanted to see how much improvement `ExecutorService` gives over the batch task execution, i thought of capturing time. Following is the code which i tried to execute - ``` package concurrency; import java.util.ArrayList; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class ExecutorExample { private static Callable<String> callable = new Callable<String>() { @Override public String call() throws Exception { StringBuilder builder = new StringBuilder(); for(int i=0; i<5; i++) { builder.append(i); } return builder.toString(); } }; public static void main(String [] args) { long start = System.currentTimeMillis(); ExecutorService service = Executors.newFixedThreadPool(5); List<Future<String>> futures = new ArrayList<Future<String>>(); for(int i=0; i<5; i++) { Future<String> value = service.submit(callable); futures.add(value); } for(Future<String> f : futures) { try { System.out.println(f.isDone() + " " + f.get()); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } } long end = System.currentTimeMillis(); System.out.println("Executer callable time - " + (end - start)); service.shutdown(); start = System.currentTimeMillis(); for(int i=0; i<5; i++) { StringBuilder builder = new StringBuilder(); for(int j=0; j<5; j++) { builder.append(j); } System.out.println(builder.toString()); } end = System.currentTimeMillis(); System.out.println("Normal time - " + (end - start)); } } ``` and here is the output of this - ``` true 01234 true 01234 true 01234 true 01234 true 01234 Executer callable time - 5 01234 01234 01234 01234 01234 Normal time - 0 ``` Please let me know if I am missing something OR understanding something in a wrong way. Thanks in advance for your time and help for this thread.