검색결과 리스트
Blocking Call에 해당되는 글 1건
- 2021.05.26 java 8 정리7
글
java 8 정리7
Java 정리
2021. 5. 26. 12:03
인프런 강의 9일차.
- 더 자바, Java 8 (백기선 강사님)
1. Callable
- Runnable과 유사하지만 작업의 결과를 받을 수 있다.
2. Future
- 비동기적인 작업의 현재 상태를 조회하거나 결과를 가져올 수 있다.
- 결과를 가져오기 get()
ExecutorService executorService = Executors.newSingleThreadExecutor();
Future<String> helloFuture = executorService.submit(() -> {
Thread.sleep(1000);
return "Callable";
});
System.out.println("Hello");
String result = helloFuture.get();
System.out.println(result);
executorService.shutdown();
- 블록킹 콜이다.
- 타임아웃(최대한 기다릴 시간)을 정할 수 있다.
3. 작업 상태 확인하기 isDone()
- 완료 했으면 true, 아니면 false를 리턴
4. 작업 취소하기 cancel()
- 취소 했으면 true, 못했으면 false를 리턴
- parameter로 true를 전달하면 현재 진행중인 쓰레드를 interrupt하고 그러지 않으면 현재 진행중인 작업이 끝날 때 까지 기다린다.
5. 여러 작업 동시에 실행하기 invokeAll()
- 동시에 실행한 작업 중에 제일 오래 걸리는 작업 만큼 시간이 걸린다.
6. 여러 작업 중에 하나라도 먼저 응답이 오면 끝내기 invokeAny()
- 동시에 실행한 작업 중에 제일 짧게 걸리는 작업 만큼 시간이 걸린다.
- 블록킹 콜이다.
package me.whiteship.java8to11;
import java.sql.SQLOutput;
import java.util.Arrays;
import java.util.concurrent.*;
public class App {
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Callable<String> hello = () -> {
Thread.sleep(2000L);
return "Hello";
};
Callable<String> java = () -> {
Thread.sleep(3000L);
return "Java";
};
Callable<String> dhpark = () -> {
Thread.sleep(1000L);
return "dhpark";
};
//3개의 Callable을 하나의 Collection으로 넘겨서 주면 Future의 List가 나오고, 그에 대해 3개의 Callable을 한번에 수행한다.
executorService.invokeAll(Arrays.asList(hello, java, dhpark));
Future<String> helloFuture = executorService.submit(hello);
System.out.println("Started!!!"); //get을 수행하기 전 까지는 코드가 쭉 실행이 된다,
helloFuture.cancel(false); //cancel을 하게 되면 isDone은 무조건 true가 된다!
//get을 만나는 순간 결과값을 가져올 때 까지 기다린다(=블록킹 콜)
//만약 cancel이 된 Future를 get하게 된다면 익셉션이 발생한다.
helloFuture.get();
String s = executorService.invokeAny(Arrays.asList(hello, java, dhpark));//any이므로 하나가 끝나면 바로 결과가 나온다
//가장 짧은 timeout인 dhpark이 호출된다.
//단 이 때 쓰레드의 타입 및 개수에 따라 다음과 같은 아웃풋이 나온다.
//SingleThread로 선언된 경우 첫 Callable이 끝날 때 가지 다음 Callable을 호출하지 못 하므로 첫번째 Callable인 Hello 호출
//fixedThread(2)로 선언 된 경우 dhpark은 들어갈 자리가 없으므로 앞의 2개의 Callable 중 먼저 끝나는 Hello가 출력
//fixedThread(4)로 선언 된 경우 가장 짧은 Callable인 dhpark이 출력
System.out.println(s);
System.out.println(helloFuture.isDone());
System.out.println("End!!!!");
executorService.shutdown();
}
}
'Java 정리' 카테고리의 다른 글
java 8 정리9 (0) | 2021.06.17 |
---|---|
java 8 정리8 (0) | 2021.06.02 |
java 8 정리6 (0) | 2021.05.21 |
java 8 정리5 (0) | 2021.05.20 |
java 8 정리4 (0) | 2021.05.19 |