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参数的传参。