Callable과 Future

구름코딩·2020년 10월 10일
0

java8 _ 더 자바

목록 보기
16/23

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());

//Callable<String>형인 hello를 Futrure<String>으로 받는다
Future<String> helloFuture = executorService.submit(hello);

//isDone()을 통해 작업상태의 완료 유무를 알수 있다 (false, true)
System.out.println(helloFuture.isDone());
System.out.println("Start!!");

//cancel() 작업 취소 - 성공하면 ture, 아니면 false반환
//현재 진행중인 작업을 interrupt한 후 중지
helloFuture.cancel(true);
//현재 진행중인 작업을 interrupt하지않고 끝날때까지 가디린다, 하지만 일단 cancel을 호출한 순간 get을 통해 값을 가져올수 없다
helloFuture.cancel(false);

//get() 결과값 가져오기
//get()을 만난순간 다음작업을 잠깐 기다렸다가 진행한다
//블록킹 call로 타임아웃(최대로 기다릴시간)을 설정할 수도 있다
String s = helloFuture.get(); // <- 만약 cancel호출하였다면 오류 발생
System.out.println(s);

System.out.println(helloFuture.isDone());
System.out.println("End!!");
executorService.shutdown();

여러개의 동시 Callable작업에 대한 처리

ExecutorService executorService = Executors.newFixedThreadPool(4);

//여러개의 Callable 작업들
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()
//여러 작업에 대해서 모든 작업이 끝나고 한번에 불러들일때 사용
//전부다 끝난 후 모두 출력, 즉 제일 오래걸리는 작업 시간만큼 걸린다
//반환타입은 Future이다
//예) 주식정보를 가져오는데 a, b, c 등 각 종목의 정보를 가져오는 속도가 다르므로 모두 가져온 후에 이를 이용
List<Future<String>> futures = executorService.invokeAll(Arrays.asList(hello, java, woonsik));
for (Future<String> f : futures)
    System.out.println(f.get());

invokeAny()
//하나의 작업에 대해서 여러 서버에 보관 또는 처리를 하였을 경우 서버중 가장 먼저 처리된 결과만을 이용해서 반환할 경우 사용 invokeAny
//가장 먼저 끝난거 하나만 출력, 즉 가장 짧게 걸리는 작업시간 만큼 걸린다
//반환값이 Future가 아닌 반환 타입 자체로 바로 나온다
//블록킹 콜이다, 따라서 해당쓰레드는 작업이 완료될때까지 다른 코드를 실행할 수 없다
String s = executorService.invokeAny(Arrays.asList(hello, java, woonsik));
System.out.println(s);

executorService.shutdown();
profile
내꿈은 숲속의잠자는공주

0개의 댓글