首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >定制ThreadPoolExecutor

定制ThreadPoolExecutor
EN

Stack Overflow用户
提问于 2013-10-10 17:27:20
回答 2查看 1.6K关注 0票数 0

我正在编写一个定制的ThreadPoolExecutor,其附加功能如下:

  1. 如果线程数大于核心池大小,但小于最大池大小和队列不满,并且没有理想的线程,则为任务创建一个新线程。
  2. 如果有理想的线程,并且随着任务的到来,将该任务分配给队列,而不是将其添加到队列中。
  3. 如果所有线程(直到最大池大小都很忙),那么随着新任务的到来,使用RejectionHandler的拒绝方法将它们添加到队列中

我重写了ThreadPoolExecutor版本java1.5的执行方法。

新守则如下:

代码语言:javascript
复制
 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
         }
     }

遗留代码如下:

代码语言:javascript
复制
 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
          }
      }

现在正在生成的问题是,当线程处于空闲状态时,它不会创建新线程,但是它甚至不会将任务分配给这些线程,而是将它们添加到队列中,这是不需要的,因为我们不希望任务等待,而是尽快处理它,即使它需要新的线程创建,但是任务不允许等待。

请帮我解决这个问题。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-10-22 21:46:17

如果我理解这个问题,我相信我已经找到了ThreadPoolExecutor默认行为的解决方案,我在这里的回答中显示了这一点:

如何使ThreadPoolExecutor在排队前将线程增加到最大?

基本上,您可以让LinkedBlockingQueuequeue.offer(...)返回false,这将在必要时向池中添加一个额外的线程。如果池已经位于最大线程,并且它们都很忙,那么将调用RejectedExecutionHandler。然后是处理程序将put(...)放入队列中。

看看我的密码。

票数 0
EN

Stack Overflow用户

发布于 2013-10-10 17:54:29

根据我对您所描述的三种功能的了解,我认为使用ExectuorService将比您目前试图做的工作做得更多:提供管理终止的方法的Executor和能够产生跟踪一个或多个异步任务进度的未来的方法,特别是:

1.捕获线程池:允许创建所需的多个线程,以并行方式执行任务。旧的可用线程将用于新任务和固定线程池。

2.固定线程池:提供一个具有固定线程数的池。如果线程不可用于该任务,则将该任务置于队列中,等待另一个任务结束。

看看这篇文章,得到详细的解释和很好的例子。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19302337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档