线程池ThreadPoolExecutor在项目中的使用(ThreadPools线程池管理类)

1、项目中可能存在多个线程池,如果使用spring进行管理则需要在@Autowired注入的时候使用@Qualifier手动指定bean name来确定使用哪个线程池

2、采用spring管理线程池在使用的时候,手写指定线程池名时idea没有自动补全

综上,建议新建一个类,将线程池作为这个类的一个静态全局变量来使用,参考如下代码:

/**
 * 线程池管理类
 */
public class ThreadPools {

    /**
     * 样例线程池
     */
    public static final ThreadPoolExecutor exampleExecutor = new ThreadPoolExecutor(
            4, 4,
            0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>(),
            new NameableThreadFactory("example"));

    /**
     * 自定义名称线程工厂
     * 基于 {@link java.util.concurrent.Executors.DefaultThreadFactory} 进行修改
     */
    private static class NameableThreadFactory implements ThreadFactory {

        private final ThreadGroup group;
        private final AtomicInteger threadNumber = new AtomicInteger(1);
        private final String namePrefix;

        public NameableThreadFactory(String name) {
            SecurityManager s = System.getSecurityManager();
            this.group = s != null ? s.getThreadGroup() : Thread.currentThread().getThreadGroup();
            if (name != null && !"".equals(name.trim())) {
                this.namePrefix = "pool-" + name + "-thread-";
            } else {
                this.namePrefix = "pool-default-thread-";
            }
        }

        @Override
        public Thread newThread(Runnable runnable) {
            Thread t = new Thread(this.group, runnable, this.namePrefix + this.threadNumber.getAndIncrement(), 0L);
            if (t.isDaemon()) {
                t.setDaemon(false);
            }
            if (t.getPriority() != Thread.NORM_PRIORITY) {
                t.setPriority(Thread.NORM_PRIORITY);
            }
            return t;
        }

    }

}

建议给线程池中的线程指定一个名字,用于区分是哪个线程池的线程,所以这里参考DefaultThreadFactory自定义了一个NameableThreadFactory用于线程池中线程的创建。

使用样例:

public class Test {

    public static void main(String[] args) {
        for (int i = 0; i < 10000; i++) {
            final int param = i;
            //Lambda表达式方式
            ThreadPools.exampleExecutor.submit(() -> {
                System.out.println(Thread.currentThread().getName()+" 执行参数:"+param);
            });
        }

        try {
            Thread.sleep(Integer.MAX_VALUE);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

使用样例中,新任务的提交使用了Lambda表达式方式,并且在循环中新定义了一个final修饰的param参数用于i参数的传参。


如果文章对您有帮助的话,欢迎老板打赏↑↑↑(请我吃饭😋