由于ThreadPoolExecutor中的最大池大小,任务被拒绝

时间:2018-12-04 12:35:29

标签: java multithreading threadpool threadpoolexecutor

应用程序已将Zuul和Eureka配置为将请求路由到后端服务,并且一切正常,直到我们进行负载测试为止。

我开始在我们的负载测试环境中执行10个并发请求,并在zuul网关中收到转发错误,原因是线程池无法为将来的任务分配线程并拒绝任务,且出现以下错误。

Caused by: java.util.concurrent.RejectedExecutionException: Task 
java.util.concurrent.FutureTask@70fe89b5 rejected from 
java.util.concurrent.ThreadPoolExecutor@25df1748[Running, pool size = 10, 
active threads = 10, queued tasks = 0, completed tasks = 1502]

我的奇迹;出于以上原因,我看到池大小只有10个,而且10个线程很忙,这很实用,因为我连续发出了10个请求。

但是我的corepoolsize应该比我在这里遇到的10大得多。是什么导致我的应用程序限制为10个池大小,我可以在我的应用程序中增加corepoolsize和maxpoolsize吗?

2 个答案:

答案 0 :(得分:1)

问题是您正在使用哪个ThreadPool? 您可以使用Java定义各种ExecutorServices,例如用于未知数量的线程的缓存线程池,这将解决您的问题(我的一个项目的示例代码):

ExecutorService pool = Executors.newCachedThreadPool();
    for(FluentCreate create: creates) {
        pool.execute(()->{
            try {
                create.execute();
            } catch (JiraException | IOException | ParseException | RestException | URISyntaxException e) {
                e.printStackTrace();
            }
        });
    }
pool.shutdown();
pool.awaitTermination(Long.MAX_VALUE, TimeUnit.MILLISECONDS);

如果您能够预测任务数,则可以使用固定线程池。

Executors.newFixedThreadPool(3);

答案 1 :(得分:1)

根据Javadocs,出于某些原因,ThreadPoolExecutor可能引发RejectedExecutionException

  • 如果无法将请求放入队列中,并且无法创建另一个池线程,因为这将超出maxPoolSize

  • 如果已经在执行程序上调用了shutdown()方法。

现在,您说您正在使用“默认的” Java执行程序,但是您不清楚这是什么意思。 (如果您向我们展示了如何获取和使用该执行器,那么更容易理解您的问题!)

但是最重要的是,池大小不太可能是导致任务被拒绝的原因。如果所有工作人员都很忙,则应将任务 排队。


  

但是我看到池的大小只有10个,在实际的[生活]场景中,这是不可行的

在许多现实生活中,池大小为10很好。但是,如果它不适合您的情况,则应考虑创建一个具有更大(或更小)池的执行程序。