Callable and Future in Java | Callable vs Runnable | Java Callable Future Example
Java Callable and Future are used a lot in multithreaded programming. Java 5 introduced java.util.concurrent.Callable interface in concurrency package that is similar to Runnable interface but it can return any Object and able to throw Exception. Java Callable tasks return java.util.concurrent.Future object. Using Java Future object, we can find out the status of the Callable task and get the returned Object. It provides get() method that can wait for the Callable to finish and then return the result.
Below is a simple example:
package com.pkm; import java.security.SecureRandom; import java.util.Date; import java.util.concurrent.Callable; import java.util.concurrent.FutureTask; /** * Created by pritom on 31/10/2017. */ public class CallableTest implements Callable { private Integer n; public static void main(String[] args) throws Exception { FutureTask[] futureTasks = new FutureTask[5]; for (Integer i = 0; i < 5; i++) { CallableTest callable = new CallableTest(i); futureTasks[i] = new FutureTask(callable); Thread thread = new Thread(futureTasks[i]); thread.start(); } for (Integer i = 0; i < 5; i++) { System.out.println(futureTasks[i].get()); } } public CallableTest(Integer n) { this.n = n; } @Override public Object call() throws Exception { System.out.println("Thread called at = " + (new Date())); Thread.sleep(1000L * (1 + (new SecureRandom().nextInt(5)))); return "Thread executed at = " + (new Date()) + ", name=" + Thread.currentThread().getName() + "." + n; } }
Output is below:
Thread called at = Tue Oct 31 16:02:08 BDT 2017 Thread called at = Tue Oct 31 16:02:08 BDT 2017 Thread called at = Tue Oct 31 16:02:08 BDT 2017 Thread called at = Tue Oct 31 16:02:08 BDT 2017 Thread called at = Tue Oct 31 16:02:08 BDT 2017 Thread executed at = Tue Oct 31 16:02:13 BDT 2017, name=Thread-0.0 Thread executed at = Tue Oct 31 16:02:13 BDT 2017, name=Thread-1.1 Thread executed at = Tue Oct 31 16:02:11 BDT 2017, name=Thread-2.2 Thread executed at = Tue Oct 31 16:02:10 BDT 2017, name=Thread-3.3 Thread executed at = Tue Oct 31 16:02:09 BDT 2017, name=Thread-4.4