ExecutorService 작업이 완료되기를 기다리는 중
질문:
어떻게 효율적으로 기다릴 수 있습니까? 완료하기 위해 ExecutorService에 제출된 모든 작업이 있습니까? 특정 사용 사례에는 여러 코어에서 실행되는 계산 작업이 포함됩니다.
배경:
주어진 코드 조각은 ExecutorService.wait()를 활용하지만 IllegalMonitorStateException으로 인해 실패합니다. 성공적인 작업 실행에도 불구하고 대기 작업에 문제가 발생한 것으로 보입니다.
답변:
ExecutorService.invokeAll()
권장되는 해결책은 ExecutorService.invokeAll()을 사용하는 것입니다. 모든 작업이 완료될 때까지 기다리는 간단한 방법을 제공합니다. 수정된 코드 예는 다음과 같습니다.
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> todo = new ArrayList<>(singleTable.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll() 동작
invokeAll()은 모든 작업이 완료될 때까지 차단됩니다. 결과 답변 컬렉션에는 각 작업의 상태와 잠재적인 반환 값을 나타내는 Future가 포함됩니다. 기본적으로 Executors.callable()로 래핑된 이러한 Future는 null을 반환합니다. 그러나 ComputeDTask를 수정하여 Callable
이점:
invokeAll()을 사용하면 코드가 단순화되고 wait()와 관련된 잠재적인 경쟁 조건이 방지됩니다. 또한 여러 주기에 대해 ExecutorService를 재사용할 수 있습니다.
관련 질문:
추가 설명을 위해 스택 오버플로에 대한 다음 관련 질문을 고려하세요.
위 내용은 모든 ExecutorService 작업이 완료될 때까지 효율적으로 기다리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!