-
Callable과 FutureBackEnd/Java 2022. 1. 23. 04:40반응형
Callable
Runnable과 유사하지만 작업의 결과를 받을 수 있습니다.
Future
비동기 작업의 현재 상태를 조회하거나 결과를 가져올 수 있습니다.
주요 API
- get(): 결과를 가져옵니다. 블록킹 콜(작업이 완료될 때까지 기다립니다.)이며, 타임아웃을 설정할 수 있습니다.
- isDone(): 작업 상태를 확인합니다. 완료 시 ture 아니면 false를 리턴합니다.
- cancel(): 취소 시 true 아니면 false를 리턴합니다. parameter로 ture를 전달하면 현재 진행중인 쓰레드를 interrupt합니다.
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 MultiThread { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadExecutor(); Callable<String> callable = () -> { Thread.sleep(2000L); return "Callable"; }; System.out.println("Started!"); Future<String> future = executorService.submit(callable); System.out.println(future.isDone()); // 작업 상태 확인하기, [결과]: false //future.cancel(true); // 작업을 취소합니다. System.out.println(future.get()); // 결과 가져오기, [결과]: 2초 후 Callable (블록킹 콜: 작업이 완료될 때까지 기다립니다.) System.out.println(future.isDone()); // 작업 상태 확인하기, [결과]: true executorService.shutdown(); System.out.println("End!"); } }
- invokeAll(): 여러 작업을 동시에 실행합니다. 동시에 실행한 작업 중 가장 오래 걸리는 작업만큼 시간이 걸립니다.
아래 코드의 수행 결과는 작업이 가장 오래걸리는 작업(3초) 후에 동시에 결과가 출력됩니다.
import java.util.Arrays; 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 MultiThread { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(3); Callable<String> one = () -> { Thread.sleep(1000L); return "One!"; }; Callable<String> another = () -> { Thread.sleep(2000L); return "Another!"; }; Callable<String> theother = () -> { Thread.sleep(3000L); return "The other!"; }; List<Future<String>> futures = executorService.invokeAll(Arrays.asList(one, another, theother)); for (Future<String> future : futures) { System.out.println(future.get()); } executorService.shutdown(); } }
- invokeAny(): 여러 작업 중 하나라도 먼저 응답이 오면 종료됩니다. 동시에 실행한 작업 중 제일 짧게 걸리는 작업만큼 시간이 걸립니다. 블록킹 콜입니다.
import java.util.Arrays; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class MultiThread { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(3); Callable<String> one = () -> { Thread.sleep(1000L); return "One!"; }; Callable<String> another = () -> { Thread.sleep(2000L); return "Another!"; }; Callable<String> theother = () -> { Thread.sleep(3000L); return "The other!"; }; String s = executorService.invokeAny(Arrays.asList(one, another, theother)); System.out.println(s); // [결과]: One ! executorService.shutdown(); } }
반응형'BackEnd > Java' 카테고리의 다른 글
Java8. parallelSort (0) 2022.01.25 Java8. CompletableFuture (0) 2022.01.23 Multi-Thread Programming (0) 2022.01.23 Java8. Date-Time API (0) 2022.01.22 Java8. Optional (0) 2022.01.22