在项目中使用线程池的时候,线程池也是一个对象,那么会有一个问题,要把这个线程池对象存在哪里呢?
一般来说有如下几种处理方案:
1、把线程池交给完成的Spring容器进行管理,在使用的时候通过@Autowired进行注入。
缺点:存在多个线程池时,需要使用@Qualifier手动指定beanName来确定使用哪个线程池,且手写beanName时没有自动提示,容易写错
2、在方法中,随用随时创建(明显不可取,如果这样还用线程池干啥?)
3、将线程池作为类的一个静态变量进行管理存储
可以写一个线程池管理类:
/**
* 线程池管理类
*/
public class ThreadPools {
/**
* 样例线程池
*/
public static final ThreadPoolExecutor commonExecutor = new ThreadPoolExecutor(
4, 8,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(32),
new ThreadPoolExecutor.CallerRunsPolicy()
);
}
使用样例:
public class Test {
public static void main(String[] args) {
for (int i = 0; i < 10000; i++) {
final int param = i;
//Lambda表达式方式
ThreadPools.commonExecutor.submit(() -> {
System.out.println(Thread.currentThread().getName()+" 执行参数:"+param);
});
}
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在使用样例中,新任务的提交使用了Lambda表达式方式,并且在循环中新定义了一个final修饰的param参数用于i参数的传参。