在工作中,一般需要我们自定义线程池,熟悉自定义线程池的创建。下面通过newSingleThreadExecutor的源码来查看如何自定义线程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
7大参数:
1、corePoolSize:核心线程数,保证线程池最少有多少线程,并且不受keepAliveTime的影响。
2、maximumPoolSize:最大线程数大小,当阻塞队列满了,就开启最大的线程池,并且受keepAliveTime的影响。
3、keepAliveTime:保持存活的时间,例如:设置存活的时间为三秒,当可执行的线程少于等于核心线程数并且3秒也没有新线程进来。就会关闭新开的线程处理。
4、TimeUnit:keepAliveTime的时间单位。
5、BlockingQueue:阻塞队列,让新来的线程等待,要输入一个队列的大小。
6、ThreadFactory:线程工厂,一般不用变。
7、拒绝策略:当线程达到最大线程数并且阻塞队列也满后,通过所选的拒绝策略来处理新来的线程。
————————————————
public static void main(String[] args) {
// 自己
ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 5, 3, TimeUnit.SECONDS, new ArrayBlockingQueue<>(4),
Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy());
try {
for (int i = 0; i < 6; i++) {
executor.execute(() -> {
System.out.println(Thread.currentThread().getName() + "ok");
});
}
} finally {
executor.shutdown();
}
}
运行结果