java创建线程池主要分为两大类:
1、使用Executors工厂类创建线程池
2、自定义创建线程池
使用Executors工厂类创建线程池的三种方式
第一种方式:
底层是用一个长度为Integer.MAX_VALUE队列来存储还未执行的任务量,只有一个线程在工作,这个线程完成一个任务之后继续去做下一个任务,所以执行时间较长。当任务量很大时,可能会产生OOM(内存溢出)
ExecutorService executorService = Executors.newSingleThreadExecutor();
第二种方式:
底层也是用长度为Integer.MAX_VALUE队列来存储还未执行的任务量,传入参数决定了线程池中线程的数量,这些线程会同时执行任务,执行时间较短。当任务量很大时也可能产生OOM(内存溢出)
ExecutorService executorService = Executors.newFixedThreadPool(10);
第三种方式:
底层使用长度为1的队列来存储下一个任务,只有队列中的任务被取走时,下一个任务才可以进入到队列中再被取走执行。这是通过不断增加线程的数量来执行的。当前面的线程执行完任务之后会再次被复用。当任务量很大而且执行任务时间比较长时可能会产生CPU一直处于100%的状态。
ExecutorService executorService = Executors.newCachedThreadPool();
创建延时任务线程池和定时任务线程池
第一种:创建有固定线程数量的延时任务线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
第二种:创建单个线程的延时任务线程池
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
创建定时周期执行任务的线程池
第一种:创建一个单线程定时任务的线程池
ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
第二种:创建一个有固定线程数量的定时任务线程池
ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(5);
自定义创建线程池:
new ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue workQueue
)
参数解释:
源码说明:
corePoolSize 线程池内核心线程数量
maximumPoolSize 线程池内最大线程数量
keepAliveTime 无处理任务时线程存活的时间
unit 此参数为keepAliveTime 的时间单位有以下7种取值:
TimeUnit.DAYS; //天
TimeUnit.HOURS; //小时
TimeUnit.MINUTES; //分钟
TimeUnit.SECONDS; //秒
TimeUnit.MILLISECONDS; //毫秒
TimeUnit.MICROSECONDS; //微妙
TimeUnit.NANOSECONDS; //纳秒
workQueue 阻塞队列用于存储等待执行的任务,一般有以下几种选择:
ArrayBlockingQueue
LinkedBlockingQueue //使用较多
SynchronousQueue //使用较多
PriorityBlockingQueue
(一个还未工作,正在代码路上踩坑努力爬起的小学生,上述表述如有误,请批评指正,谢谢!)