Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 自定义线程池执行器_Java_Multithreading_Threadpoolexecutor - Fatal编程技术网

Java 自定义线程池执行器

Java 自定义线程池执行器,java,multithreading,threadpoolexecutor,Java,Multithreading,Threadpoolexecutor,我正在编写一个定制的ThreadPoolExecutor,具有以下额外功能:- 若线程数大于核心池大小但小于最大池大小,且队列未满且不存在理想线程,则为任务创建新线程 如果存在理想的线程,并且随着任务的到来,将该任务分配给队列,而不是将其添加到队列中 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中 我已经重写了的execute方法 新守则如下:- public void execute(Runnable command

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

  • 若线程数大于核心池大小但小于最大池大小,且队列未满且不存在理想线程,则为任务创建新线程

  • 如果存在理想的线程,并且随着任务的到来,将该任务分配给队列,而不是将其添加到队列中

  • 如果所有线程(最大池大小)都忙,则在新任务到来时,使用RejectionHandler的reject方法将它们添加到队列中

  • 我已经重写了的execute方法

    新守则如下:-

     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
    相同。你能再详细解释一下吗?