ExecutorService: 작업 완료 대기
ExecutorService는 효율적인 작업 실행을 위한 편리한 도구이지만 모든 작업이 완료될 때까지 일시 중지하는 것은 까다로울 수 있습니다. 일반적인 문제와 실제적인 해결 방법을 살펴보겠습니다.
wait() 오류
고정 스레드 풀 ExecutorService를 사용하는 인용된 코드 조각은 다음과 같은 문제를 경험합니다. es.wait()를 사용하려고 할 때 IllegalMonitorStateException이 발생합니다. 이는 wait()가 ExecutorService가 아닌 특정 스레드 동기화 관용구와 함께 사용하기 위한 것이기 때문에 발생합니다.
가장 간단한 솔루션: 호출All()
ExecutorService는 다음을 위한 더 간단한 대안을 제공합니다. 이 목적은 다음과 같습니다: InvokeAll(). 이 메서드는 호출 가능한 작업 모음을 가져와서 병렬로 실행하고 모든 작업이 완료될 때까지 차단합니다. 사용 방법은 다음과 같습니다.
ExecutorService es = Executors.newFixedThreadPool(2); List<Callable<Object>> todo = new ArrayList<>(uniquePhrases.size()); for (DataTable singleTable: uniquePhrases) { todo.add(Executors.callable(new ComputeDTask(singleTable))); } List<Future<Object>> answers = es.invokeAll(todo);
invokeAll()은 각각 개별 작업을 나타내는 Future 개체 목록을 반환합니다. 모든 작업이 완료되면 Future의 isDone()에 액세스하면 true가 반환됩니다.
invokeAll()의 장점
다른 방법
callable을 구현하려면 InvokeAll() 작업이 필요하다는 점을 기억하세요. ComputeDTask가 Runnable인 경우 코드 조각에 표시된 대로 래핑하거나 Executors.callable()을 활용하세요.
위 내용은 ExecutorService에서 모든 작업이 완료될 때까지 효율적으로 기다릴 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!