>Java >java지도 시간 >모든 ExecutorService 작업이 완료될 때까지 효율적으로 기다리는 방법은 무엇입니까?

모든 ExecutorService 작업이 완료될 때까지 효율적으로 기다리는 방법은 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-12-03 12:28:10191검색

How to Efficiently Wait for All ExecutorService Tasks to Finish?

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를 재사용할 수 있습니다.

관련 질문:

추가 설명을 위해 스택 오버플로에 대한 다음 관련 질문을 고려하세요.

  • [모든 스레드가 완료될 때까지 기다리는 방법 완료](https://stackoverflow.com/questions/13796491/how-to-wait-for-all-threads-to-finish)
  • [Java의 반환 값 스레드](https://stackoverflow.com/questions/11937661/return-values-from-java-threads)
  • [invokeAll()은 수락할 의사가 없음 컬렉션<호출 가능>](https://stackoverflow.com/questions/24168027/invokeall-not-willing-to-accept-a-collectioncallablet)
  • [필요합니까 동기화하시겠습니까?](https://stackoverflow.com/questions/546386/do-i-need-to-synchronize)

위 내용은 모든 ExecutorService 작업이 완료될 때까지 효율적으로 기다리는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.