如何在java中动态调整缓存线程池的大小

如何在java中动态调整缓存线程池的大小,java,multithreading,customization,executors,Java,Multithreading,Customization,Executors,我正在做异步线程,在我的工作中使用未来。我希望它的功能类似于“cachedThreadPool”,但也可以做以下两件事: 增加每次线程成功完成时允许的最大线程数 减少线程抛出异常或超时时允许的最大线程数 在自定义线程池执行器中是否可以执行此操作?我不熟悉以这种方式使用执行器,因此为我指明正确的方向将非常有助于解决这个问题。动态调整线程池的大小应该仔细考虑。如果您有超时,并且您的响应是减少线程的数量,那么假设任务是可并行的,这可能会使问题变得更糟 无论如何,下面的代码可以在任务引发异常时更改池的大

我正在做异步线程,在我的工作中使用未来。我希望它的功能类似于“cachedThreadPool”,但也可以做以下两件事:

  • 增加每次线程成功完成时允许的最大线程数

  • 减少线程抛出异常或超时时允许的最大线程数


  • 在自定义
    线程池执行器中是否可以执行此操作?我不熟悉以这种方式使用执行器,因此为我指明正确的方向将非常有助于解决这个问题。

    动态调整线程池的大小应该仔细考虑。如果您有超时,并且您的响应是减少线程的数量,那么假设任务是可并行的,这可能会使问题变得更糟

    无论如何,下面的代码可以在任务引发异常时更改池的大小,并在任务成功完成时使池变大

    class ManagedThreadPoolExecutor extends ThreadPoolExecutor {
          @Override
          protected void afterExecute(Runnable r, Throwable t) {
               if(t != null)
                    setMaximumPoolSize(getMaximumPoolSize()-1);
               else
                    setMaximumPoolSize(getMaximumPoolSize()+1);
    
          }
    }
    

    ?谢谢你的回复,我知道这种方法,但我需要知道我到底从哪里调用它?就像在线程抛出异常的情况下,如何从自定义类检索当前最大数量并增加它?有一个getMaximumPoolSize()方法。您可以通过重写afterExecute方法来处理threadpool中未捕获的异常。很抱歉重复发布,但基本上,自定义threadpool如何知道其线程中是否抛出了异常?出于好奇,为什么要增加threadpool的大小?项目将排队,直到线程可用。如果这是因为您计划生成子线程并将其添加到池中,那么您可能需要使用Java 8中的新代码。该代码将减小池大小,但实际上无法正确设置大小
    getMaximumPoolSize()--
    返回递减之前的原始计数。可能应该使用
    --getMaximumPoolSize()
    ++getMaximumPoolSize()
    instead@RyanJ考虑到这让我感到困惑,我让它变得更明显了。注意,我现在真的只是在这里做实验。我也会试试Powerlord的建议。我在这里感觉很傻,因为我错过了afterExecute方法中的一个可丢弃参数。