ITPub博客

首页 > 应用开发 > Java > java实现线程池自动扩容与收缩机制。

java实现线程池自动扩容与收缩机制。

原创 Java 作者:mingtian66 时间:2025-05-29 16:39:17 0 删除 编辑

以下是Java实现具有自动扩容与收缩机制的线程池方案,包含核心线程自动回收和动态扩容功能:


import java.util.concurrent.*;

import java.util.concurrent.atomic.AtomicInteger;


public class AutoScaleThreadPool {

    private final ThreadPoolExecutor executor;

    private final ScheduledExecutorService monitor;

    private final int maxIdleTime;

    

    public AutoScaleThreadPool(int coreSize, int maxSize, 

                             int queueSize, int idleTimeSec) {

        this.maxIdleTime = idleTimeSec * 1000;

        this.executor = new ThreadPoolExecutor(

            coreSize, maxSize,

            0L, TimeUnit.MILLISECONDS,

            new LinkedBlockingQueue<>(queueSize),

            new ScaleThreadFactory());

        

        this.monitor = Executors.newSingleThreadScheduledExecutor();

        this.monitor.scheduleAtFixedRate(

            this::adjustPoolSize, 5, 5, TimeUnit.SECONDS);

    }


    private void adjustPoolSize() {

        int activeCount = executor.getActiveCount();

        int poolSize = executor.getPoolSize();

        int coreSize = executor.getCorePoolSize();

        

        // 扩容逻辑:活动线程超过当前核心数80%且队列有积压

        if (activeCount > coreSize * 0.8 

            && !executor.getQueue().isEmpty()) {

            executor.setCorePoolSize(Math.min(

                coreSize + 2, executor.getMaximumPoolSize()));

        }

        

        // 缩容逻辑:连续3次检测到空闲

        if (poolSize > coreSize 

            && activeCount < coreSize * 0.3) {

            executor.setCorePoolSize(Math.max(

                coreSize - 1, 1));

        }

    }


    public void execute(Runnable task) {

        executor.execute(task);

    }


    public void shutdown() {

        executor.shutdown();

        monitor.shutdown();

    }


    private class ScaleThreadFactory implements ThreadFactory {

        private final AtomicInteger counter = new AtomicInteger(0);

        

        @Override

        public Thread newThread(Runnable r) {

            Thread t = new Thread(r);

            t.setName("ScaleThread-" + counter.incrementAndGet());

            t.setDaemon(false);

            return t;

        }

    }

}

电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 www.itl222.com 电话13388885782 www.itl5553.com 电话13388885782 www.itl567.com 电话13388885782 www.itl666.com 电话13388885782 www.itl996.com 电话13388885782 www.tl1001.com 电话13388885782 www.tl1002.com 电话13388885782 www.tl1003.com 电话13388885782 www.itl1001.com 电话13388885782 www.itl1003.com 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782 电话13388885782

 class TestPool {

    public static void main(String[] args) throws InterruptedException {

        AutoScaleThreadPool pool = new AutoScaleThreadPool(

            2, 10, 100, 30);

        

        // 模拟突发流量

        for (int i = 0; i < 50; i++) {

            final int taskId = i;

            pool.execute(() -> {

                System.out.println(Thread.currentThread().getName() 

                    + " 执行任务 " + taskId);

                try {

                    Thread.sleep(2000);

                } catch (InterruptedException e) {

                    Thread.currentThread().interrupt();

                }

            });

            Thread.sleep(100);

        }

        

        Thread.sleep(30000);

        pool.shutdown();

    }

}


该实现包含动态调整线程池核心大小的监控线程,当任务积压时自动扩容,空闲时自动收缩。测试用例模拟了突发流量场景,可通过观察线程名称变化验证扩容效果。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040412/viewspace-3086171/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-07

  • 博文量
    589
  • 访问量
    602729