티스토리 뷰

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

댓글
최근에 올라온 글
최근에 달린 댓글
링크
Total
Today
Yesterday