작성
·
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() 상태로 변경됩니다.
질문하신 내용에 답변이 되었는지요? 질문을 조금 더 구체적으로 알려주시면 추가로 답변 드리겠습니다.
감사합니다.
제가 생각한 위 코드의 동작 방식을 말씀드리면
future1.get() 을 하면 main 스레드는 wait 상태로 변경, thread-1 실행
thread-1이 종료되면 main 스레드는 runnable 상태로 변경
main 스레드의 log(end - st + "ms"); 실행
future2.get() -> main 스레드는 wait 상태로 변경 -> thread-1이 종료된 경우 thread-1 재사용, 종료되지 않은 경우 thread-2를 사용
위와 같이 생각했지만 출력 로그를 확인한 결과 thread-1, thread-2의 작업이 모두 종료되고, log(end - st + "ms"); 코드가 실행되었습니다.
어떻게 실행시간 로그가 future2.get() 메서드보다 나중에 출력되는지가 궁금합니다!