使用哪个Java线程池执行器来轻松调整池大小?

时间:2015-05-22 17:24:20

标签: java spring threadpoolexecutor

我需要运行大量短期任务。我使用ThreadPoolTaskExecutor,但我需要在运行时自动更改最小/最大线程池大小。怎么做?

我现在使用外部AtomicInteger变量并在提交之前增加它并在lambda-callback中减少它。我可以以某种方式跳过它吗?只是使用线程池执行器而不是其他任何东西?

我阅读了很多文章,人们不建议这样做,我的解决方案是好还是可以简化它?我用春天,也许我可以用那里的东西?

3 个答案:

答案 0 :(得分:2)

来自API doc of ThreadPoolExecutor

  

(...)最典型的情况是,仅设置核心和最大池大小   构造,但它们也可以使用动态更改   setCorePoolSize(int)和setMaximumPoolSize(int)。

因此,如果确实需要在运行时修改这些参数,请实例化geo-position并根据需要进行配置。

但是在你需要动态线程池之前应该三思而后行。通常,如果你的任务没有绑定到任何其他资源而不是CPU,那么拥有比处理器更多的线程是不利的。

那么为什么不使用Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT 作为近似值?

答案 1 :(得分:0)

如果我理解了它,那么在任务启动时,您要求池创建一个新线程(增加池大小),并在任务结束时要求它关闭一个线程(减小池大小) - 请正确我,如果我误解你了!

这就是你在做什么我会考虑放弃这种方法而只是让游泳池'。创建线程并不便宜,我认为你的任务可以一次又一次地重用相同的线程(那是什么池)。一个好方法是将线程数设置为处理器数量,如isnot2bad所示。

答案 2 :(得分:0)

现在我想我更了解你的问题。鉴于该描述,我认为每个工作者有一个ThreadPoolExecutor是一个很好的方法:

  // Worker 1 //
  int w1ThPoSize = 5; // Initially 5 threads are assigned to worker 1
  ThreadPoolExecutor w1ThPo = 
    new ThreadPoolExecutor(w1ThPoSize,
                           w1ThPoSize,
                           0, // No excess threads, so keep alive time is not relevant
                           TimeUnit.MILLISECONDS, // keep alive time is 0, so no relevant
                           new LinkedBlockingQueue<Runnable>());

  // Sending a task for worker 1
  w1ThPo.execute(() -> { System.out.println("I'm running"); });

  // Resizing worker 1 thread pool 
  w1ThPoSize = 10;
  w1ThPo.setCorePoolSize(w1ThPoSize);
  w1ThPo.setMaximumPoolSize(w1ThPoSize);

  // (similar approach for remaining workers)

  // When done, remember to shutdown thread pools!
  w1ThPo.shutdown();