今天学习线程池,一开始用Executors.newFixedThreadPool
来创建线程池,但是阿里巴巴的代码规约插件提示不要这怎么写。于事就研究了一下怎么创建定制的线程池:
相关参考链接:
线程池创建
多线程编程学习五(线程池的创建)
Java Code Examples for com.google.common.util.concurrent.ThreadFactoryBuilder
阿里巴巴创建线程池规约:线程池不允许通过Executors创建,而是通过ThreadPoolExecutor的方式,这样的处理方式能更加明确线程池的运行规则,规避资源耗尽的风险。
- newFixedThreadPool(n)和newSingleThreadExecutor():主要问题是堆积的请求处理队列可能会耗费非常大的内存
- newCachedThreadPool()和newScheduledThreadPool(n):主要问题是线程最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,耗费内存资源。
示例实现方式:
package com.fuqi.newcreatemethods;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.*;
/**
* @Description: 创建线程的方式四:使用线程池
* @Author 傅琦
* @Date 2019/6/15 16:25
* @Version V1.0
*/
public class ThreadPoolLearn1 {
public static void main(String[] args) {
ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();
ExecutorService executorService = new ThreadPoolExecutor(5, 10, 2000L ,TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
// execute方法适合用于实现了Runnable接口的类
executorService.execute(new NumberThread());
executorService.execute(new NumberThread());
executorService.shutdown();
}
}
class NumberThread implements Runnable{
@Override
public void run() {
for (int i = 0; i < 101; i++) {
if (i % 2 == 0){
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
}
}
说明:
- 所用到的ThreadFactoryBuilder是com.google.guava包里的ThreadFactory构建类,要用的话,需要在引入相应的包。这里再maven工程中导入相应的依赖:
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>18.0</version>
</dependency>
- ThreadPoolExecutor中的构造器的参数详解可参见如下链接(具体内容以后再整理):
java线程池01-ThreadPoolExecutor构造方法参数的使用规则
ThreadPoolExecutor 参数详解
ThreadPoolExecutor中的参数详解