##| 一、如何创建线程池? |
1、七大参数介绍
| 1)corePoolSize |
核心线程数,一直存在线程池中(除非设置了allowCoreThreadTimeOut),创建好就等待就绪,去执行任务
| 2)maximumPoolSize |
最大线程数,设置最大线程数是为了控制资源
| 3)keepAliveTime |
存活时间,如果当前的线程数大于核心线程数,并且线程空闲的时间大于存活时间了,则会执行释放线程的操作。(释放的数量为:maximumPoolSize - corePoolSize)
| 4)unit |
时间单位
| 5)workQueue |
阻塞队列,如果任务有很多,就会将目前多的任务放到队列中,当有空闲的线程时,就会从队列中取出新的任务继续执行。
| 6)threadFactory |
线程的创建工厂
| 7)handler |
拒绝策略,如果队列满了,按照我们指定的拒绝策略拒绝执行任务
有哪些拒绝策略?
-
DiscardOldestPolicy
如果有新的任务进来就会丢去最旧的未执行的任务 -
AbortPolicy
直接丢弃新任务,抛出异常 -
CallerRunsPolicy
如果有新任务进来,直接调用run()方法,同步执行操作 -
DiscardPolicy
直接丢弃新进来的任务,不会抛出异常
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler)
// 常见的创建线程的方式
// 1)Executors . newCachedThreadApol() // 核心为0,所有都可回收的线程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
// 2)Ехесutоrѕ . nеwFіхеdТhrеаdРооl() 固定大小的线程池,不会过期
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
// 3)Executors . newScheduledThreadPool() 定时任务的线程池
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
}
// 4)Executors . newSingleThreadExecutor() 单线程的线程池,后台从队列中获取任务,一个一个执行
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory));
}
问:一个corePoolSize