ThreadPoolExecutor에 대한 간단한 질문입니다. 다음과 같은 상황이 있습니다. 큐에서 개체를 소비하고 적절한 작업자 작업을 만들어 ThreadPoolExecutor에 제출해야합니다. 이것은 아주 간단합니다. 그러나 종료 시나리오에서 많은 작업자가 실행 대기열에있을 수 있습니다. 이러한 작업 중 하나가 한 시간 동안 실행될 수 있기 때문에 응용 프로그램을 상대적으로 빠르게 종료하려면 ThreadPoolExecutor에서 대기중인 작업을 모두 삭제하고 이미 처리중인 작업은 정상적으로 완료되어야합니다.ThreadPoolExecutor의 대기중인 작업을 모두 제거
ThreadPoolExecutor 설명서에는 remove() 메서드가 있지만 특정 작업 만 제거 할 수 있습니다. purge()은 이미 취소 된 향후 작업에만 적용됩니다. 내 아이디어는 모든 대기열에있는 작업을 보유하고있는 대기열을 지우는 것이 었습니다. ThreadPoolExecutor에이 내부 큐에 액세스 할 수 있지만, 문서 상태 :
방법 getQueue()를 디버깅 모니터링 목적 작업 큐에 액세스 할 수있다. 이 방법을 다른 목적으로 사용하면 은 강력하게 입니다.
그래서이 대기열을 잡고 지우는 것은 옵션이 아닙니다. 또한, 문서의이 조각은 말한다 :
두 제공된 방법, 제거 (java.lang.Runnable의)와 퍼지를() 의 큰 숫자가 취소 될 작업을 대기 할 때 스토리지에 개척을 돕기 위해 사용할 수있는 .
어떻게? 물론, 나는 executor에게 제출 한 모든 task의리스트를 유지할 수있다. 그리고 shutdown case에서 모든 항목을 반복하고 remove() 메소드로 ThreadPoolExecutor에서 제거한다 ... 그러나 ... 기억의 낭비와이 목록을 유지하는 번거 로움. (예 : 이미 실행 된 작업 제거)
나는 어떤 힌트 또는 해결책을 주셔서 감사합니다!
이것은 가장 깨끗한 접근 방법 일 수 있으므로이 대답을 수락합니다. :-) 나는 이미 그와 같은 것이 있기를 바랐다. :-) – Malax