단일 스레드가 병렬로 수행 할 수있는 I / O 집약적 인 작업을 생성하는 솔루션을 코딩하려고합니다. 각 작업에는 중요한 인 메모리 데이터가 있습니다. 따라서 현재 보류중인 작업의 수를 제한 할 수 있기를 원합니다.
다음과 같이 ThreadPoolExecutor를 생성하면 :
ThreadPoolExecutor executor = new ThreadPoolExecutor(numWorkerThreads, numWorkerThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(maxQueue));
그런 다음이 executor.submit(callable)
발생 RejectedExecutionException
큐가 가득하고 모든 스레드가 이미 바쁜 때.
executor.submit(callable)
대기열이 가득 차고 모든 스레드가 사용 중일 때 차단 하려면 어떻게해야 합니까?
편집 : 나는 노력 이 :
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
그리고 그것은 내가 원하는 효과를 다소 달성하지만 우아하지 않은 방식으로 (기본적으로 거부 된 스레드는 호출 스레드에서 실행되므로 호출 스레드가 더 많이 제출하지 못하도록 차단합니다).
편집 : (질문을 한 후 5 년)
이 질문과 그 답변을 읽는 사람에게 허용 된 답변을 하나의 올바른 해결책으로 받아들이지 마십시오. 모든 답변과 의견을 읽으십시오.