Вы пытались использовать методы 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++;
}
}
}
}