Callable
- Runnable과 비슷하지만 반환형이 void인 Runnable과 다르게 반환값이 존재한다
- 작업의 결과를 받을수 있다
Future
- 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다
- 작업이 완료될 때까지 기다렸다가(블로킹되었다가) 최종 결과를 얻는데 사용
- Futrue객체를 지연 완료(pending Completion) 객체라고도 한다
Future
Future<\T>메소드 활용
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> hello = () -> {
Thread.sleep(1000L);
return "Hello";
};
System.out.println(hello.call());
Future<String> helloFuture = executorService.submit(hello);
System.out.println(helloFuture.isDone());
System.out.println("Start!!");
helloFuture.cancel(true);
helloFuture.cancel(false);
String s = helloFuture.get();
System.out.println(s);
System.out.println(helloFuture.isDone());
System.out.println("End!!");
executorService.shutdown();
여러개의 동시 Callable작업에 대한 처리
ExecutorService executorService = Executors.newFixedThreadPool(4);
Callable<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
Callable<String> java = () -> {
Thread.sleep(3000L);
return "java";
};
Callable<String> woonsik = () -> {
Thread.sleep(1000L);
return "woonsik";
};
invokeAll()
List<Future<String>> futures = executorService.invokeAll(Arrays.asList(hello, java, woonsik));
for (Future<String> f : futures)
System.out.println(f.get());
invokeAny()
String s = executorService.invokeAny(Arrays.asList(hello, java, woonsik));
System.out.println(s);
executorService.shutdown();