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