beforeExecute 및 afterExecute 메서드를 사용해 보셨습니까? 이들은 작업이 실행되기 전후에 호출됩니다. after execute 메서드는 throwable을 두 번째 인수로 제공하기 때문에 작업이 실패한 시점을 알 수 있습니다.
beforeExecute가 활성 작업의 값을 증가시키고 afterExecute가 감소 시키도록 후크를 추가 할 수 있습니다. 물론 이러한 메서드는 각각의 필드에서 호출되므로 상호 잠금 개체에서 결과를 동기화해야합니다.
이러한 메서드를 사용하려면 선택한 ThreadPoolExecutor 개체를 재정의하고 거기에 후크를 추가하십시오.
예를 들어, 다음 코드는 희망 작동합니다 :
public class MyExecutor extends ThreadPoolExecutor {
//Lock object used for synchronization
private final Object lockObject = new Object();
//Contains the active task count
private int activeTaskCount = 0;
//Failed task count
private int failedTaskCount = 0;
private int succeededTaskCount = 0;
public MyExecutor() {
//call super here with your parameters;
}
public int getActiveTaskCount(){
synchronized(lockObject){
return activeTaskCount;
}
}
public int getFailedTaskCount(){
synchronized(lockObject){
return failedTaskCount ;
}
}
public int getSucceededTaskCount(){
synchronized(lockObject){
return succeededTaskCount ;
}
}
protected void beforeExecute(Thread t,
Runnable r){
super.beforeExecute(t,r);
synchronized(lockObject){
activeTaskCount++;
}
}
protected void afterExecute(Runnable r,Throwable t){
super.afterExecute(r,t);
synchronized(lockObject){
activeTaskCount--;
if(t!=null){
failedTaskCount++;
}else{
succeededTaskCount++;
}
}
}
}
명세서 ("대기열에있는 활성 작업") 자체 모순 : 당신은 "활성 작업"또는 "대기열에있는 작업"원하는가? 대기열의 작업이 활성 상태가 아니기 때문에 대기열에 있습니다. –
또한 "실패한 작업"이 의미하는 바를 명확히 할 수 있습니까? 실패를 구성하는 것은 전적으로 당신에게 달렸습니다. ThreadPoolExecutor는 실제로 스레드가 완료되었거나 실행 중 일부 (비 비즈니스 로직) 시스템 오류가 발생했다는 개념만을 가지고 있습니다. 반환 상태를 확인하거나 확인 된 예외를 잡아 실패를 판단해야하는 경우에는 ['Future'] (http://download.oracle.com/javase/6/docs/api/java/util/concurrent)를 사용해야합니다. /Future.html). –
요구 사항에 대해 정확하지 않은 것에 대해 사과드립니다. 나는 기본적으로 예정된 작업 수를 찾고 있지만 런타임에 완료되지 않은 작업 수를 찾으려고합니다. 그리고 나는 "실패한 작업"을 예정된 작업으로 간주하지만 오류로 인해 성공적으로 완료하지 못했습니다. – invinc4u