我需要运行大量的短期任务。我使用ThreadPoolTaskExecutor
,但我需要在运行时自动更改最小/最大线程池大小。怎么做?哪个Java线程池执行器用于轻松调整池大小?
我现在使用外部AtomicInteger变量,并在提交之前增加它,并在lambda回调中减少它。我可以以某种方式跳过它吗?只需使用线程池执行程序,而不用做其他任何事情?
我看过很多文章,人们不建议这样做,我的解决方案好吗,还是我可以简化它?我用春天,可能我可以用那里的东西?
我需要运行大量的短期任务。我使用ThreadPoolTaskExecutor
,但我需要在运行时自动更改最小/最大线程池大小。怎么做?哪个Java线程池执行器用于轻松调整池大小?
我现在使用外部AtomicInteger变量,并在提交之前增加它,并在lambda回调中减少它。我可以以某种方式跳过它吗?只需使用线程池执行程序,而不用做其他任何事情?
我看过很多文章,人们不建议这样做,我的解决方案好吗,还是我可以简化它?我用春天,可能我可以用那里的东西?
从API doc of ThreadPoolExecutor:
(...)最典型的是,核心和最大池大小仅在 建设集,但它们也可以使用 setCorePoolSize(int)和setMaximumPoolSize动态改变(INT )。
因此,如果确实需要在运行时修改这些参数,请实例化一个ThreadPoolExecutor
并根据需要对其进行配置。
但是,在你需要动态线程池之前,你应该三思。通常,如果你的任务没有绑定到任何其他资源而是CPU,那么拥有比处理器更多的线程是不利的。
那么为什么不使用Runtime.getRuntime().availableProcessors()
作为近似值呢?
如果我了解它,当任务开始时,您要求池创建一个新线程(增加池大小),并要求它在任务结束时关闭一个线程(减小池大小) - 请使用纠正我,如果我误解你了!
这就是你在做什么我会考虑放弃这种方法,只是'让池是'。创建线程并不便宜,我假设你的任务可以一次又一次地重复使用相同的线程(这是池的用途)。一个好的方法是按照isnot2bad的建议将线程数设置为处理器的数量。
现在我想我更了解您的问题。鉴于这种描述,我认为每个工人有一个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();
谢谢你的答复球员,让我来描述它更详细。我有f。即5名工人。工人 - 是一个合乎逻辑的工作单位。我的PM想要有4个worker1线程,3个worker2线程,等等。而且他还希望能够在运行时更改每个工作人员的最大线程数。所以我想使用5个线程池并分别调整每个线程的线程数。你觉得我可以做得更好吗?谢谢 – avalon