작성
·
238
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 상태로 변경된다고 이해하면 될까요?
답변 2
0
[스레드풀의 스레드가 작업을 시작하는 시점]
은 [get()을 호출하는 시점]
이 아니고, [submit()을 호출하는 시점]
입니다. 또한 submit()
은 non-blocking method이므로 main 스레드는 스레드 풀에게 작업을 수행해달라는 명령만 전달하고, 본인의 스택에 있는 코드를 이어서 수행할 수 있습니다.
Future<Integer> future1 = es.submit(task1); // pool-1-thread-1 작업 시작. non-blocking
Future<Integer> future2 = es.submit(task2); // pool-1-thread-2 작업 시작. non-blocking
// non-blocking이므로 main에 이어지는 코드들이 계속 수행...
// ...
log(end - st + "ms"); // 마찬가지로 수행됨
Integer sum2 = future2.get();
// ...
0
제가 생각한 위 코드의 동작 방식을 말씀드리면
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() 메서드보다 나중에 출력되는지가 궁금합니다!
get()
은"작업을 시작해"
가 아니고,"(submit() 이후로) 진행하고 있던 작업을 완료하고, 나에게 그 결과를 리턴해 줘(나는 그때까지 기다리고 있을게)."
입니다.