我需要运行大量短期任务。我使用ThreadPoolTaskExecutor
,但我需要在运行时自动更改最小/最大线程池大小。怎么做?
我现在使用外部AtomicInteger变量并在提交之前增加它并在lambda-callback中减少它。我可以以某种方式跳过它吗?只是使用线程池执行器而不是其他任何东西?
我阅读了很多文章,人们不建议这样做,我的解决方案是好还是可以简化它?我用春天,也许我可以用那里的东西?
答案 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();