Bootstrap

Java创建线程池

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

(一个还未工作,正在代码路上踩坑努力爬起的小学生,上述表述如有误,请批评指正,谢谢!)

;