如何在运行时更新ThreadPoolExecutor线程池大小

时间:2018-01-15 08:53:45

标签: java multithreading threadpool

我有以下代码,其中有3个类

  1. ThreadPoolTest.java

  2. Parent.java(可运行)

  3. Child.java(可运行)

  4. 我已经从ThreadPoolTest.java每隔10秒调度一次父线程,一旦启动父线程,在其run()中创建100个子线程。

    我的要求是每次启动父线程,我想使用相同的线程执行程序。

    目前我已经给出了50的游泳池大小。 在运行时,我想为每个父线程执行更新此池大小。

    这可以实现吗?(建议吗?)

    如果是,我们怎样才能做到这一点?

    public class ThreadPoolTest {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            Parent parent = new Parent();
            Thread parentThread = new Thread(parent);
            parentThread.setName("Parent");
            try {
                ScheduledExecutorService executor_instant = Executors.newSingleThreadScheduledExecutor();
                executor_instant.scheduleAtFixedRate(parentThread, 0, 10, TimeUnit.SECONDS);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
    }
    
    
    public class Parent implements Runnable {
    
    private static ThreadPoolExecutor executor;
    private static int threadPoolSize = 50;
    static {
        executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(threadPoolSize);
    
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            Child child = new Child();
            executor.execute(child);
        }
    }
    }
    
    
    public class Child implements Runnable {
    
    @Override
    public void run() {
        // TODO Auto-generated method stub
    
        for (int i = 0; i < 3; i++) {
            try {
                Thread.sleep(5000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    
    }
    

1 个答案:

答案 0 :(得分:1)

使用setCorePoolSize(int)设置新的最小尺寸。

我建议您使用Executors.newCachedThreadPool,这样,您就可以将创建线程池大小的责任赋予ThreadPoolExecutorThreadPoolExecutor如果需要执行新任务,则创建新线程,以及使用Executors.newCachedThreadPool()

重用现有的