Java 自定义线程池执行器
我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:-Java 自定义线程池执行器,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- 若线程数大于核心池大小但小于最大池大小,且队列未满且不存在理想线程,则为任务创建新线程 如果存在理想的线程,并且随着任务的到来,将该任务分配给队列,而不是将其添加到队列中 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了的execute方法 新守则如下:- public void execute(Runnable command
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命令){
System.out.println(“活动计数:”+getActiveCount()+“池大小:”+getPoolSize()+“空闲计数:”+(getPoolSize()-getActiveCount())+“队列大小:”+getQueue().Size());
如果(命令==null)
抛出新的NullPointerException();
对于(;;){
如果(运行状态!=正在运行){
拒绝(命令);
返回;
}
if(poolSize0)//已创建新线程
返回;
如果(状态==0){//创建线程失败
拒绝(命令);
返回;
}
if(workQueue.offer(命令))
返回;
//如果创建了一个新线程,但它正忙于另一个任务,请重试
}
}
遗留代码如下所示:-
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
}
}
public void execute(Runnable命令){
如果(命令==null)
抛出新的NullPointerException();
对于(;;){
如果(运行状态!=正在运行){
拒绝(命令);
返回;
}
if(poolSize0)//已创建新线程
返回;
如果(状态==0){//创建线程失败
拒绝(命令);
返回;
}
//如果创建了一个新线程,但它正忙于另一个任务,请重试
}
}
现在产生的问题是,当线程空闲时,它不会创建新线程,但它甚至不会将任务分配给这些线程,否则它会将它们添加到队列中,这是不需要的,因为我们不希望任务等待,但会尽快处理它,即使它需要创建新线程,但任务不允许等待
请帮我解决这个问题。谢谢。据我对您描述的三个功能的了解,我认为使用将比您目前尝试的做得更多:一个
执行器,它提供了管理终止的方法,以及可以产生未来跟踪一个或多个异步任务进度的方法,特别是:
1.捕获线程池:允许创建执行并行任务所需的任意多个线程。旧的可用线程将被重新用于新任务和固定线程池
2.固定线程池:提供具有固定线程数的池。如果某个线程不可用于该任务,则该任务将被放入队列中,等待其他任务结束
如果我理解了这个问题,我相信我已经找到了ThreadPoolExecutor
默认行为的解决方案,我在这里的回答中显示了:
基本上,您可以LinkedBlockingQueue
让它在队列中始终返回false。如果需要,提供(…)
,这将向池中添加额外的线程。如果池已达到最大线程数,并且它们都很忙,则将调用RejectedExecutionHandler
。然后是处理程序将(…)
放入队列中
查看我的代码。这不是的默认行为吗?不,这不是缓存线程池,我们已经创建了一个容量更大的队列。为什么要通过重写execute来实现这一点?您可以通过创建一个线程池,使用,并为其提供core-and-maxpoolsize以及一个无界队列来完成您想要的任务。然后它将完全符合您描述的行为。不,我不想使用缓存池和固定池,因为我已经对最大池大小设置了上限,并且我想说它们都在内部实现ThreadPoolExecutor。@Tusharrivastava,您的最大池大小和核心池大小的第一个条件对我来说非常模糊。你为什么需要这样的约束。Fixed thread pool(固定线程池)允许每次设置固定数量的线程,这与我的max pool size
相同。你能再详细解释一下吗?