2015-05-22 46 views
2

我需要运行大量的短期任务。我使用ThreadPoolTaskExecutor,但我需要在运行时自动更改最小/最大线程池大小。怎么做?哪个Java线程池执行器用于轻松调整池大小?

我现在使用外部AtomicInteger变量,并在提交之前增加它,并在lambda回调中减少它。我可以以某种方式跳过它吗?只需使用线程池执行程序,而不用做其他任何事情?

我看过很多文章,人们不建议这样做,我的解决方案好吗,还是我可以简化它?我用春天,可能我可以用那里的东西?

回答

2

API doc of ThreadPoolExecutor

(...)最典型的是,核心和最大池大小仅在 建设集,但它们也可以使用 setCorePoolSize(int)和setMaximumPoolSize动态改变(INT )。

因此,如果确实需要在运行时修改这些参数,请实例化一个ThreadPoolExecutor并根据需要对其进行配置。

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

那么为什么不使用Runtime.getRuntime().availableProcessors()作为近似值呢?

0

如果我了解它,当任务开始时,您要求池创建一个新线程(增加池大小),并要求它在任务结束时关闭一个线程(减小池大小) - 请使用纠正我,如果我误解你了!

这就是你在做什么我会考虑放弃这种方法,只是'让池是'。创建线程并不便宜,我假设你的任务可以一次又一次地重复使用相同的线程(这是池的用途)。一个好的方法是按照isnot2bad的建议将线程数设置为处理器的数量。

+0

谢谢你的答复球员,让我来描述它更详细。我有f。即5名工人。工人 - 是一个合乎逻辑的工作单位。我的PM想要有4个worker1线程,3个worker2线程,等等。而且他还希望能够在运行时更改每个工作人员的最大线程数。所以我想使用5个线程池并分别调整每个线程的线程数。你觉得我可以做得更好吗?谢谢 – avalon

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();