티스토리 뷰
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<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
//executorService.submit(call); 퓨쳐로 받을 수 있암
Future<String> 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<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
Future<String> 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<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
// executorService.submit(call); 퓨쳐로 받을 수 있음
Future<String> 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<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
Callable<String> java = () -> {
Thread.sleep(3000L);
return "java";
};
Callable<String> spring = () -> {
Thread.sleep(1000L);
return "spring";
};
//3개 한꺼번에 보내기
List<Future<String>> futures = executorService.invokeAll(Arrays.asList(hello, java, spring));
// 제일 늦은 java가 끝날때까지 기다림
for(Future<String> f:futures ){
System.out.println(f.get());
}
executorService.shutdown();
}
}
- 동시에 실행한 작업 중, 제일 오래 걸리는 작업만큼 시간 걸림
- 여러 작업 중에 하나라도 먼저 응답이 오면 끝내기 : invokeAny()
ㄴ동시에 실행한 작업 중, 제일 짧게 걸리는 작업만큼 시간걸림
ㄴ 블록킹 콜
강의 : 인프런 더 자바, Java8
'Java' 카테고리의 다른 글
JVM GC(Garbage Collection) 종류 및 내부 원리 정리 (0) | 2023.07.19 |
---|---|
[Java8] CompletableFuture-Concurrent 프로그래밍2. Execurtors (0) | 2021.12.08 |
[Java8] CompletableFuture-Concurrent 프로그래밍1. 스레드 (0) | 2021.12.07 |
[Java8] Optional 소개 및 API (0) | 2021.07.18 |
[Java8] Stream API 예제 (0) | 2021.07.10 |
댓글
최근에 올라온 글
최근에 달린 댓글
링크
- Total
- Today
- Yesterday