[Java8] CompletableFuture-Concurrent 프로그래밍3. Callable과 Future

[Java8] CompletableFuture-Concurrent 프로그래밍3. Callable과 Future

강의 : 인프런 더 자바, Java8

https://www.inflearn.com/course/the-java-java8/dashboard

Callable

- Runnable과 유사하지만 작업의 결과를 받을 수 있다 (값을 return 할 수 있다)

Future

- 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다

결과값 가져오기 get()

import java.util.concurrent.*; public class App { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Callable hello = () -> { Thread.sleep(2000L); return "Hello"; }; //executorService.submit(call); 퓨쳐로 받을 수 있암 Future submit = executorService.submit(hello); System.out.println("=====start====="); submit.get(); // 블로킹 System.out.println("=====end====="); } }

- 코드를 실행해 보면 start는 굉장히 빨리 찍히지만 end는 늦게 찍히는걸 볼 수 있음 -> 2초후에 실행되기 때문에

- get() 이전까진 코드가 안기다리고 쭉 실행되다가 get()을 만나는 순간 결과값을 가져올때까지 기다린다

- submit()은 Future로 받을 수 있음

작업 상태 확인하는 isDone()

import java.util.concurrent.*; public class App { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Callable hello = () -> { Thread.sleep(2000L); return "Hello"; }; Future helloFuture = executorService.submit(hello); System.out.println(helloFuture.isDone()); //끝낫으면 true 안끝났으면 false System.out.println("=====start====="); helloFuture.get(); // 블로킹 System.out.println(helloFuture.isDone()); //끝낫으면 true 안끝났으면 false System.out.println("=====end====="); executorService.shutdown(); } }

- isDone()은 완료했으면 true, 아니면 false 리턴

작업취소하기 cancel()

import java.util.concurrent.*; public class App { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Callable hello = () -> { Thread.sleep(2000L); return "Hello"; }; // executorService.submit(call); 퓨쳐로 받을 수 있음 Future helloFuture = executorService.submit(hello); System.out.println(helloFuture.isDone()); //끝낫으면 true 안끝났으면 false System.out.println("=====start====="); helloFuture.cancel(false); System.out.println(helloFuture.isDone()); //끝낫으면 true 안끝났으면 false System.out.println("=====end====="); executorService.shutdown(); } }

- 현재진행하는 작업 취소 했으면 true, 못했으면 false 리턴

- cancel()을 쓰고 get() 쓰면 에러난다 -> 이미 취소한거에서 뭘 가져오라는 격

여러작업 동시에 실행하기 invokeAll()

import java.util.Arrays; import java.util.List; import java.util.concurrent.*; public class App { public static void main(String[] args) throws ExecutionException, InterruptedException { ExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); Callable hello = () -> { Thread.sleep(2000L); return "Hello"; }; Callable java = () -> { Thread.sleep(3000L); return "java"; }; Callable spring = () -> { Thread.sleep(1000L); return "spring"; }; //3개 한꺼번에 보내기 List> futures = executorService.invokeAll(Arrays.asList(hello, java, spring)); // 제일 늦은 java가 끝날때까지 기다림 for(Future f:futures ){ System.out.println(f.get()); } executorService.shutdown(); } }

- 동시에 실행한 작업 중, 제일 오래 걸리는 작업만큼 시간 걸림

- 여러 작업 중에 하나라도 먼저 응답이 오면 끝내기 : invokeAny()

ㄴ동시에 실행한 작업 중, 제일 짧게 걸리는 작업만큼 시간걸림

ㄴ 블록킹 콜

from http://dear-by-dear.tistory.com/63 by ccl(A) rewrite - 2021-12-08 23:27:34