인프런 커뮤니티 질문&답변

도토리묵님의 프로필 이미지
도토리묵

작성한 질문수

김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성

Future4 - 이유

future.get()

작성

·

131

0

    public static void main(String[] args) throws InterruptedException, ExecutionException {

        SumTask task1 = new SumTask(1, 50);
        SumTask task2 = new SumTask(51, 100);

        ExecutorService es = Executors.newFixedThreadPool(2);

        Future<Integer> future1 = es.submit(task1);
        Future<Integer> future2 = es.submit(task2);

        log("작업 시작");
        long st = System.currentTimeMillis();
        Integer sum1 = future1.get();

        long end = System.currentTimeMillis();

        log(end - st + "ms");
        Integer sum2 = future2.get();
        log("task1.result = " + sum1);
        log("task2.result = " + sum2);

        int sumAll = sum1 + sum2;
        log("task1 + task2 = " + sumAll);

        es.close();
    }
02:45:32.785 [     main] 작업 시작
02:45:32.785 [pool-1-thread-1] 작업 시작
02:45:32.785 [pool-1-thread-2] 작업 시작
02:45:34.794 [pool-1-thread-1] 작업 완료 result = 1275
02:45:34.794 [pool-1-thread-2] 작업 완료 result = 3775
02:45:34.797 [     main] 2007ms
02:45:34.797 [     main] task1.result = 1275
02:45:34.797 [     main] task2.result = 3775
02:45:34.797 [     main] task1 + task2 = 5050

 

맨 위 코드를 실행했을 때 위와 같은 출력이 나왔습니다.

main 메서드는 BlockingQueue에 등록된 future를 스레드 풀에서 가용 가능한 스레드 만큼 모두 실행 시킨 후에 WAITING 상태로 변경된다고 이해하면 될까요?

답변 1

0

안녕하세요. 도토리묵님, 공식 서포터즈 코즈위버입니다.

Executor 에 쓰레드를 submit() 하는 순간 main과 다른 별도의 스레드가 생성됩니다. 그러나 main은 대기상태로 빠지지 않고 계속 다음 코드를 수행하게 됩니다.

단, future1.get(); 코드를 만나는 순간 thread-1 번이 종료될때까지 main 쓰레든느 wait() 상태로 변경됩니다.

질문하신 내용에 답변이 되었는지요? 질문을 조금 더 구체적으로 알려주시면 추가로 답변 드리겠습니다.

감사합니다.

도토리묵님의 프로필 이미지
도토리묵
질문자

제가 생각한 위 코드의 동작 방식을 말씀드리면

  1. future1.get() 을 하면 main 스레드는 wait 상태로 변경, thread-1 실행

  2. thread-1이 종료되면 main 스레드는 runnable 상태로 변경

  3. main 스레드의 log(end - st + "ms"); 실행

  4. future2.get() -> main 스레드는 wait 상태로 변경 -> thread-1이 종료된 경우 thread-1 재사용, 종료되지 않은 경우 thread-2를 사용

위와 같이 생각했지만 출력 로그를 확인한 결과 thread-1, thread-2의 작업이 모두 종료되고, log(end - st + "ms"); 코드가 실행되었습니다.

어떻게 실행시간 로그가 future2.get() 메서드보다 나중에 출력되는지가 궁금합니다!

도토리묵님의 프로필 이미지
도토리묵
질문자

혹시 Executor에 스레드를 submit 하는 순간 스레드 풀에 가용 가능한 스레드가 남아 있을 경우 Callable 구현체의 call 메서드가 바로 실행되나요?

도토리묵님의 프로필 이미지
도토리묵

작성한 질문수

질문하기