In the case of Runnable job Thread wouldn’t return anything after completing a job.
If a thread is require to return some result after execution then we should go for Callable.
Callable interface contains only 1 method call().
Object call() throws Exception
If we submit Callable object to Executor then after completing the job thread returns an Object of the type Future.
That is Future object can be used to retrieve the result from Callable job.
package com.example.thread;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;/** * @author code.factory * */ public class CallableTest { public static void main(String... args) throws InterruptedException, ExecutionException { MyCallable jobs[] = { new MyCallable(10), new MyCallable(20), new MyCallable(30), new MyCallable(40), new MyCallable(50), new MyCallable(60), }; ExecutorService service = Executors.newFixedThreadPool(3); for(MyCallable job : jobs) { Future f = service.submit(job); System.out.println(f.get()); } service.shutdown(); } }class MyCallable implements Callable { int no; public MyCallable(int no) { this.no = no; }
public Object call() throws Exception { System.out.print(Thread.currentThread().getName() + " sum of first " + no + " numbers : "); int sum = 0; for(int i=0; i<no; i++) { sum = sum + i; } return sum; } }
Output :
pool-1-thread-1 sum of first 10 numbers : 45 pool-1-thread-2 sum of first 20 numbers : 190 pool-1-thread-3 sum of first 30 numbers : 435 pool-1-thread-1 sum of first 40 numbers : 780 pool-1-thread-2 sum of first 50 numbers : 1225 pool-1-thread-3 sum of first 60 numbers : 1770