ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Callable과 Future
    BackEnd/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

    댓글

Designed by Tistory.