ExecutorService는 여러 작업을 한번에 편리하게 처리하는 invokeAll(), invokeAny() 기능을 제공합니다
모든 Callble 작업을 제출하고 모든 작업이 완료될때까지 기다리는 메소드와
지정된 시간 내에 모든 Callable 작업을 제출하고 완료될때까지 기다리는 메소드를 제공합니다
하나의 Callable 작업이 완료될때까지 기다리고, 가장 먼저 완료된 작업의 결과를 반환하며
완료되지 않은 나머지 작업은 취소하는 메소드와
지정된 시간 내에 하나의 Callable 작업이 완료될때까지 기다리고, 가장 먼저 완료된 작업을 반환하며
완료되지 않은 나머지 작업은 취소하는 메소드를 제공합니다
이 둘을 이용하면 한꺼번에 여러 작업을 요청할 수 있습니다
List<CallableTask> takss = List.of(task1, task2, task3);
List<Future<Integer>> futures = service.invokeAll(tasks);
invokeAll은 한번에 여러 작업을 제출하고, 모든 작업이 완료될때까지 기다립니다
List<CallableTask> takss = List.of(task1, task2, task3);
Integer res = service.invokeAny(tasks);
invokeAny()는 한번에 여러 작업을 제출하고, 가장 먼저 완료된 작업의 결과를 반환합니다
이때 완료되지 않은 나머지 작업은 인터럽트를 통해 취소합니다