我正在编写一个自定义的 ThreadPoolExecutor,它具有以下额外功能:-
如果线程数大于核心池大小但小于最大池大小并且队列未满且没有理想线程,则为任务创建一个新线程。
如果有理想的线程并且随着任务的到来将该任务分配到队列而不是将其添加到队列中。
如果所有线程(最大池大小都忙),那么随着新任务的到来,使用 RejectionHandler 的拒绝方法将它们添加到队列中
我已经覆盖了ThreadPoolExecutor 版本 java 1.5的执行方法。
新代码如下:-
public void execute(Runnable command) {
System.out.println(" Active Count: "+getActiveCount()+" PoolSize: "+getPoolSize()+" Idle Count: "+(getPoolSize()-getActiveCount())+" Queue Size: "+getQueue().size());
if (command == null)
throw new NullPointerException();
for (;;) {
if (runState != RUNNING) {
reject(command);
return;
}
if (poolSize < corePoolSize && addIfUnderCorePoolSize(command)) {
return;
}
if (runState == RUNNING && (getPoolSize()-getActiveCount() != 0) && workQueue.offer(command)) {
return;
}
int status = addIfUnderMaximumPoolSize(command);
if (status > 0) // created new thread
return;
if (status == 0) { // failed to create thread
reject(command);
return;
}
if (workQueue.offer(command))
return;
// Retry if created a new thread but it is busy with another task
}
}
遗留代码如下:-
public void execute(Runnable command) {
if (command == null)
throw new NullPointerException();
for (;;) {
if (runState != RUNNING) {
reject(command);
return;
}
if (poolSize < corePoolSize && addIfUnderCorePoolSize(command))
return;
if (workQueue.offer(command))
return;
int status = addIfUnderMaximumPoolSize(command);
if (status > 0) // created new thread
return;
if (status == 0) { // failed to create thread
reject(command);
return;
}
// Retry if created a new thread but it is busy with another task
}
}
现在产生的问题是,当线程空闲时它没有创建新线程,但它甚至没有将任务分配给这些线程,否则它会将它们添加到队列中,这是不希望的,因为我们不希望任务等待但是即使它需要创建新线程但不允许等待任务,也要尽快处理它。
请帮助我解决这个问题。谢谢。