您是否尝试过使用beforeExecute和afterExecute方法?这些在执行任务之前和之后调用。 after执行方法甚至提供了一个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++;
}
}
}
}
你的说法(“队列中的活动任务”)自相矛盾:你想“活动任务”或“队列中的任务”?由于队列中的任务未处于活动状态,因此它们将排队。 – 2011-04-06 21:12:26
另外,你能澄清你的意思是“失败的任务”吗?什么构成失败完全取决于你; ThreadPoolExecutor实际上只有一个线程完成的概念,或者在执行期间发生了一些(非业务逻辑)系统错误。如果您需要检查返回状态或捕获检查异常以确定失败,则需要使用['Future'](http://download.oracle.com/javase/6/docs/api/java/util/concurrent /Future.html)s。 – 2011-04-06 21:41:08
我对不准确的要求表示歉意。我基本上是在运行时试图找出已安排但尚未完成的任务数量。而且我会将“失败的任务”视为已安排的任务,但由于某些错误未成功完成。 – invinc4u 2011-04-07 19:15:54