Threads: Callable Future
Notes
My Way
This is how I did it, and this what worked for me.
public class MyCallableLambda {
public static void main(String[] args) {
ArrayList<Future<String>> list = new ArrayList<>();
ExecutorService executor = Executors.newCachedThreadPool();
Callable<String> callable = () -> {
// Do stuff
return Thread.currentThread().getName();
};
Future<String> future = executor.submit(callable);
list.add(future);
// Get Futures
try {
for (Future<String> fut : list) {
String string = fut.get();
System.out.println(string);
}
} catch (InterruptedException | ExecutionException e){
e.printStackTrace();
} finally {
executor.shutdown();
}
}
}
This way did not work
public class MyCallable implements Callable<String> {
@Override
public String call() throws Exception {
Thread.sleep(1000);
//return the thread name executing this callable task
return Thread.currentThread().getName();
}
public static void main(String args[]){
//Get ExecutorService from Executors utility class, thread pool size is 10
ExecutorService executor = Executors.newFixedThreadPool(10);
//create a list to hold the Future object associated with Callable
List<Future<String>> list = new ArrayList<Future<String>>();
//Create MyCallable instance
Callable<String> callable = new MyCallable();
for(int i=0; i< 100; i++){
//submit Callable tasks to be executed by thread pool
Future<String> future = executor.submit(callable);
//add Future to the list, we can get return value using Future
list.add(future);
}
for(Future<String> fut : list){
try {
//print the return value of Future, notice the output delay in console
// because Future.get() waits for task to get completed
System.out.println(new Date()+ "::"+fut.get());
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
//shut down the executor service now
executor.shutdown();
}
}