Executors:JDK给提供的线程工具类,静态方法构建线程池服务ExecutorService,也就是ThreadPoolExecutor,使用默认线程池配置参数。
建议:对于大用户,高并发,不易掌控的项目,不建议使用Executors来创建线程池对象。
对于易于掌控且并发数不高的项目,可以考虑Executors。
ThreadPoolExecutor:线程池对象,实现ExecutorService接口,可以自定义线程池核心线程数、最大线程数、空闲时间、缓冲队列等。
建议:大用户,高并发,不易于掌控的项目,建议根据物理服务器配置,任务需求耗时,可能存在的并发量,自定义配置ThreadPoolExecutor线程信息。
一般项目会封装ThreadPoolExecutor工具类,因为需要考虑新手有时会乱用,也方便于统一灵活管理。
一、先说下Executors 创建线程池的三种策略
1.创建无边界缓存线程池:Executors.newCachedThreadPool()
无边界缓存界线程池:不限制最大线程数的线程池,且线程有空闲存活时长。
接着看下JDK Executors.newCachedThreadPool()源码:
源码可以可以看到,该方法创建了一个线程池为:核心线程数0,最大线程数Integer.MAX_VALUE(可以理解为无上限),线程空闲存活时长60,单位TimeUnit.SECONDS秒,缓冲队列是SynchronousQueue的线程池。
因为最大线程数没有上限,所以,大用户,高并发项目使用时一定要严谨配置。
关于SynchronousQueue缓冲队列的缓冲数是1,不过每次都被线程池创建取走,所以该缓冲对联永远isEmpty=true。具体细节先百度,后续有时间我再讲解。
2.创建有边界线程池:Executors.newFixedThreadPool(200)
有边界线程池:有最大线程数限制的线程池。
接着看下JDK Executors.newFixedThreadPool(200)源码:
源码可以可以看到,该方法创建了一个线程池为:核心线程数nThreads(200),最大线程数nThreads (200),线程空闲存活时长0,单位TimeUnit.SECONDS秒,缓冲队列是LinkedBlockingQueue的线程池。
LinkedBlockingQueue这里没有定义长度,也就是说这个缓冲队列的容量没有上限,大用户,高并发项目使用时一定要严谨配置。
3.创建单线程线程池:Executors.newSingleThreadExecutor()
单线程线程池:线程池里只有一个线程数,其他都存在缓冲队列里,
接着看下JDK Executors.newSingleThreadExecutor()源码:
源码可以可以看到,该方法创建了一个线程池为:核心线程数1,最大线程数1,线程空闲存活时长0,单位TimeUnit.MILLISECONDS毫秒,缓冲队列是LinkedBlockingQueue的线程池。
LinkedBlockingQueue这里没有定义长度,也就是说这个缓冲队列的容量没有上限,大用户,高并发项目使用时一定要严谨配置。
使用场景:任务需要逐一调度执行。
原文地址:https://www.cnblogs.com/zwcry/p/12050383.html