2014-12-29 6 views
0

java.util.concurrent.ThreadPoolExecutor을 사용하는 동안 거부 된 작업을 다시 한 번 실행하려고했습니다. 정말 가능합니까? 나는 RejectedExecutionHandler 인터페이스에 대해 들었다. ThreadPoolExecutor.AbortPolicy, ThreadPoolExecutor.CallerRunsPolicy, ThreadPoolExecutor.DiscardOldestPolicy, ThreadPoolExecutor.DiscardPolicy 등의 인터페이스 (RejectedExecutionHandler)의 사용 가능한 인스턴스가 많이 있지만 문제는 실행을 다시 시도 할 수 없다는 것입니다.사용자 지정 RejectedExecutionHandler 사용

답변

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/ 아래

+0

이것은 가능한 해결책이지만 매우 드문 경우입니다. 만약 하나의 풀이 실행을 거절한다면, 풀을 풀어서는 안된다. –

+0

과 같은 다른 문제로 인해 거부가 발생할 수도 있습니다. 로컬 메모리 한계를 초과하거나 실행 프로그램이 이전에 종료 된 경우입니다. –

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) { 
        ; 
       } 
      } 

     } 

    }