작업 실행과 결과 기다리기를 분리합니다.
ExecutorService는 스레드 생성과 작업 큐를 관리하고 submit은 Future를 반환합니다. get은 완료를 기다리며 timeout을 지정할 수 있고 사용 후 shutdown해야 합니다.
값을 돌려주는 람다라서 submit은 이를 Callable로 받고 결과를 담을 Future<Integer>를 바로 반환합니다. get(1, TimeUnit.SECONDS)는 최대 1초 기다렸다가 50000과 2를 꺼내 합계: 100000을 만들고, 시간을 넘기면 TimeoutException을 던집니다. finally의 shutdownNow는 대기 중인 작업을 실행하지 않고 실행 중인 작업에는 인터럽트를 보내며, shutdown은 받은 작업을 끝까지 실행하게 둡니다.
작업 실패는 ExecutionException의 cause로 전달됩니다. 인터럽트를 잡으면 스레드의 interrupt 상태를 복원하는 규칙을 지킵니다.
스레드 풀 크기, 큐 길이, 거부 정책과 요청 시간 제한을 함께 설정해 과부하가 전체 서비스로 퍼지지 않게 합니다.
작업마다 무제한 새 스레드를 만들거나 executor 종료를 빠뜨리지 마세요.
직접 바꿔보세요두 계산을 동시에 제출하고 합계를 출력하세요.
실행 버튼을 누르면 결과가 여기에 표시됩니다.