728x90
728x90
Callable과 Future
Runnable로 동작을 실행할 때 return받는 값이 없다. 따라서 쓰레드를 처리하고 그 결과로 값을 얻어야한다면 Runnable을 사용하면 안된다.
Callable은 제너릭타입을 리턴타입으로 갖고 있기 때문에 return타입이 필요하다면 Callable사용하면 된다.
Future는 이렇게 동작하는 비동기 작업의 현재상태를 조회하거나 결과를 가져올 수 있는 역할을 수행한다.
ExecutorService ex = Executors.newFixedThreadPool(3);
Callable<String> hello = () -> {
Thread.sleep(5000L);
return "Hello";
};
Future<String> future = ex.submit(hello);
System.out.println(future.isDone());
System.out.println("Stated!");
//future.get();
future.cancel(false);
System.out.println(future.isDone());
System.out.println("End!");
- Callable을 정의하여주고, 동일하게 submit()을 사용하여 실행해줄 수 있다.
- 이 때 실행하는 것의 상태나 결과를 조회할 수 있게 future를 받을 수 있다.
- 현재 작업이 완료되었는지는 future의 isDone()으로 알 수 있으며 만약 작업이 완료되었다면 true 아직 완료되지 않았다면 false를 리턴해준다.
- 결과를 조회하는 방법은 future.get()을 사용해주면 되며 이 때 최종 결과가 나올 때 까지 블로킹이 된다.
- 만약 쓰레드의 작업을 취소하고 싶으면 cancel()을 수행하면 되며 cancel()에 파라미터로 true가 오면 interrupt를 날리고 중지하고, false가 오면 모두 실행 후 중지를 해준다.
- cancel을 하면 get()으로 가져올 수 없다.
여러개의 Callable 처리
동시에 여러개의 Callable을 처리할 수 있다.
ExecutorService ex = Executors.newFixedThreadPool(3);
Callable<String> hello = () -> {
Thread.sleep(5000L);
return "Hello";
};
Callable<String> world = () -> {
Thread.sleep(3000L);
return "world";
};
Callable<String> nice = () -> {
Thread.sleep(1000L);
return "nice";
};
List<Future<String>> futures = ex.invokeAll(Arrays.asList(hello, world, nice));
for(Future<String > future : futures){
System.out.println("future = " + future.get());
}
- invokeAll()을 사용해주면 여러개의 Callable을 처리할 수 있다.
- 동작 과정은 모든 Callable에 대한 작업을 처리하게 된다.
- 그리고 나서 처리된 작업으로 결과를 보여주게 된다.
- 즉 모든 작업을 처리하고 나서 뒤에 결과를 주는 것이 invokeAll()이다.
ExecutorService ex = Executors.newFixedThreadPool(3);
Callable<String> hello = () -> {
Thread.sleep(5000L);
return "Hello";
};
Callable<String> world = () -> {
Thread.sleep(3000L);
return "world";
};
Callable<String> nice = () -> {
Thread.sleep(1000L);
return "nice";
};
String s = ex.invokeAny(Arrays.asList(hello, world, nice));
- invokeAny()로 처리를 하게 되면 Callable중 하나라도 완료가 되면 그 결과 값을 반환받게 된다.
728x90
728x90
'Language > Java' 카테고리의 다른 글
Java8의 Annotation (0) | 2022.03.08 |
---|---|
CompletableFuture로 비동기 프로그래밍 공부하기! (0) | 2022.03.04 |
자바 Excuter로 쓰레드 처리하기 (0) | 2022.03.03 |
자바 쓰레드의 기초 (0) | 2022.03.03 |
Java8의 시간 API 알아보기(LocalDateTime, Instant 등) (0) | 2022.03.01 |