java.util.concurrent.ThreadPoolExecutor
을 사용하는 동안 거부 된 작업을 다시 한 번 실행하려고했습니다. 정말 가능합니까? 나는 RejectedExecutionHandler
인터페이스에 대해 들었다. ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy 등의 인터페이스 (RejectedExecutionHandler)의 사용 가능한 인스턴스가 많이 있지만 문제는 실행을 다시 시도 할 수 없다는 것입니다.사용자 지정 RejectedExecutionHandler 사용
0
A
답변
1
예 거부 된 작업의 실행을 다시 시도 할 수 있습니다. 실행을 재 시도하는 가장 좋은 방법은 대체 실행 프로그램을 사용하는 것입니다. 다른 인터페이스와 마찬가지로 사용자 정의 RejectedExecutionHandler 클래스를 선언 할 수 있습니다.
public class MyRejectedExecutionHandler implements RejectedExecutionHandler {
@Override
public void rejectedExecution(Runnable worker, ThreadPoolExecutor executor) {
// TODO Auto-generated method stub
System.out.println(worker.toString()+" is Rejected");
System.out.println("Retrying to Execute");
try{
//Re-executing with alternateExecutor
MainClass.alternateExecutor.execute(worker);
System.out.println(worker.toString()+" Execution Started");
}
catch(Exception e)
{
System.out.println("Failure to Re-exicute "+e.getMessage());
}
}
}
당신은에서 이것에 대해 더 자세한 정보를 찾을 수 있습니다 : http://examples.javacodegeeks.com/core-java/util/concurrent/rejectedexecutionhandler/java-util-concurrent-rejectedexecutionhandler-example/ 아래
1
는 추가 ThreadPoolExecutor에 필요하지 않은 재시도 가능 RejectedExecutionHandler입니다 는 여기에 몇 가지 코드 샘플입니다. 좀 더 실용적입니다. 작업이 거부되면 거부 된 작업이 ThreadPoolExecutor의 workerQueue에 차단 모드로 설정됩니다. 그러면 ThreadPoolExecutor가 더 많은 작업을 처리하기 전에 작업 제출자가 잠시 대기하게됩니다.
new RejectedExecutionHandler() {
@Override
public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
if (!executor.isShutdown()) {
try {
executor.getQueue().put(r);
} catch (InterruptedException e) {
;
}
}
}
}
이것은 가능한 해결책이지만 매우 드문 경우입니다. 만약 하나의 풀이 실행을 거절한다면, 풀을 풀어서는 안된다. –
과 같은 다른 문제로 인해 거부가 발생할 수도 있습니다. 로컬 메모리 한계를 초과하거나 실행 프로그램이 이전에 종료 된 경우입니다. –