0

我正在编写一个自定义的 ThreadPoolExecutor,它具有以下额外功能:-

  1. 如果线程数大于核心池大小但小于最大池大小并且队列未满且没有理想线程,则为任务创建一个新线程。

  2. 如果有理想的线程并且随着任务的到来将该任务分配到队列而不是将其添加到队列中。

  3. 如果所有线程(最大池大小都忙),那么随着新任务的到来,使用 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
          }
      }

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

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

4

2 回答 2

0

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

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

基本上你LinkedBlockingQueue让它总是返回 false queue.offer(...),如有必要,它将向池中添加额外的线程。如果池已经处于最大线程并且它们都忙,RejectedExecutionHandler则将被调用。然后是处理程序put(...)进入队列。

在那里查看我的代码。

于 2013-10-22T21:46:17.513 回答
-1

就我对您描述的三个功能的了解而言,我认为使用ExectuorService将比您目前正在尝试做的事情做得更多:Executor提供管理终止的方法和可以产生未来以跟踪一个或更多异步任务,特别是:

1.捕获线程池:允许创建并行执行任务所需的线程。旧的可用线程将被重新用于新任务和固定线程池。

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

查看这篇文章以获得详细的解释和很好的例子。

于 2013-10-10T17:54:29.610 回答