Java线程池
什么是线程池?
线程池负责维护一个或多个线程的运行,让我们在实际的项目编码中不用自己编写维护线程的逻辑,简化编程,提高代码的鲁棒性,易读性。
线程池的创建方法
通过java.util.concurrent.ThreadPoolExecutor创建
构造方法
ThreadPoolExecutor构造方法
1 2 3 4 5 6 7 8 9 10
| public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) { }
|
构造参数
- corePoolSize:核心线程大小
- maxiumumPoolSize:最大线程大小
- keepAliveTime:非核心线程的闲置线程存活时间
- unit:闲置时间单位
- workQueue:工作队列
- threadFactory:线程工厂
- handler:线程溢出处理
线程池规则
- 如果线程数量<=核心线程数量,那么直接启动一个核心线程来执行任务,不会放入队列中。
如果线程数量>核心线程数,但<=最大线程数,并且任务队列是LinkedBlockingDeque的时候,超过核心线程数量的任务会放在任务队列中排队。
- 如果线程数量>核心线程数,但<=最大线程数,并且任务队列是SynchronousQueue的时候,线程池会创建新线程执行任务,这些任务也不会被放在任务队列中。这些线程属于非核心线程,在任务完成后,闲置时间达到了超时时间就会被清除。
- 如果线程数量>核心线程数,并且>最大线程数,当任务队列是LinkedBlockingDeque,会将超过核心线程的任务放在任务队列中排队。也就是当任务队列是LinkedBlockingDeque并且没有大小限制时,线程池的最大线程数设置是无效的,他的线程数最多不会超过核心线程数。
- 如果线程数量>核心线程数,并且>最大线程数,当任务队列是SynchronousQueue的时候,会因为线程池拒绝添加任务而抛出异常。
通过java.util.concurrent.Executors的四种预设创建方式
实际上通过Executors的预设创建线程池,也是通过ThreadPoolExecutor类创建
- newCachedThreadPool:创建核心线程数为0,最大线程为Integer.MAX的线程池,进入线程池的线程会立刻执行,闲置超过60s清除
1 2 3 4 5 6
| public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
|
- newFixedThreadPool :创建指定核心线程数,最大线程数与核心线程数相同,没有非核心线程所以闲置时间为0,当前核心线程运行中的线程<最大线程时,线程立刻执行,否则压队列,队列中线程会在核心线程中的线程执行完后执行
1 2 3 4 5 6
| public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
|
- newScheduledThreadPool:创建一个定长线程池,支持定时及周期性任务执行
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) { return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory); }
public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue(), threadFactory); }
|
- newSingleThreadExecutor:创建一个同时只有一个线程执行的线程池,超过执行数量的线程会进入队列,和newFixedThreadPool的区别只有同时运行线程数的区别
1 2 3 4 5 6 7
| public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); }
|