ExecutorService - 작업 완료를 기다리는 솔루션
동시에 실행해야 하는 다수의 계산 작업을 처리할 때 모든 작업이 완료될 때까지 기다릴 수 있는 메커니즘을 갖추는 것이 중요합니다. 이렇게 하면 모든 작업이 완료된 후에만 후속 작업을 수행할 수 있습니다.
이를 달성하기 위해 ExecutorService.wait()를 사용하려는 예에서는 IllegalMonitorStateException이 발생합니다. 이 오류는 객체의 고유 잠금을 기다릴 때 wait()가 사용되기 때문에 발생하며 이는 이 시나리오에는 적용되지 않습니다.
가장 간단한 해결 방법은 ExecutorService.invokeAll()을 활용하는 것입니다. 이 메서드는 Callable 작업 컬렉션을 가져와 병렬로 실행하고 Future 개체 목록을 반환합니다. 각 Future는 특정 작업의 결과를 나타냅니다. 기본적으로 InvokeAll()은 Future 개체 목록을 반환하기 전에 모든 작업이 완료될 때까지 차단합니다.
코드를 수정하는 방법은 다음과 같습니다.
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> tasks = new ArrayList<>(); for (DataTable singleTable : uniquePhrases) { tasks.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> results = es.invokeAll(tasks);
이 업데이트된 코드에서 ExecutorService는 .invokeAll()은 모든 작업이 완료될 때까지 기다리므로 안심하고 후속 작업을 진행할 수 있습니다.
위 내용은 ExecutorService를 진행하기 전에 모든 작업이 완료되었는지 어떻게 확인할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!