1 通过 Executors 工厂类来创建线程池
创建线程池的方法 | |
---|---|
newFixedThreadPool | 有固定线程数的线程池,如果没有任务执行,那么线程会一直等待 |
newCachedThreadPool | 线程池里有很多线程需要同时执行,老的可用线程将被新的任务触发重新执行,如果线程超过60秒内没执行,那么将被终止并从池中删除 |
newWorkStealingPool | 创建一个拥有多个任务队列(以便减少连接数)的线程池 |
newScheduledThreadPool | 该线程池可用于定时或周期性任务的执行 |
newSingleThreadExecutor | 只有一个线程的线程池,所有提交的任务是顺序执行 |
newSingleThreadScheduledExecutor | 只有一个线程,该线程池可用于定时或周期性任务的执行 |
1 各线程池适应场景总结
1.1 newFixedThreadPool:创建一个固定大小的线程池,因为采用无界的阻塞队列,所以实际线程数量永远不会变化,适用于可以预测线程数量的业务中,或者服务器负载较重,对当前线程数量进行限制
1.2 newCachedThreadPool:用来创建一个可以无限扩大的回收型线程池,适用于服务器负载较轻,执行很多短期异步任务
1.3 newWorkStealingPool:创建一个拥有多个任务队列的线程池,可以减少连接数,创建当前可用cpu数量的线程来并行执行,适用于大耗时的操作,可以并行来执行
1.4 newScheduledThreadPool:可以延时启动,定时启动的线程池,适用于需要多个后台线程执行周期任务的场景
1.5 newSingleThreadExecutor:创建一个单线程的,适用于需要保证顺序执行各个任务,并且在任意时间点,不会有多个线程是活动的场景
1.6 newSingleThreadScheduledExecutor:创建一个单线程的,适用于需要保证顺序执行各个任务,并且在任意时间点,不会有多个线程是活动的场景,同时可以延时启动,定时启动的线程池
2 采用线程池的优势
2.1 重用存在的线程,减少对象创建、消亡的开销,性能佳
2.2 可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞
2.3 提供定时执行、定期执行、单线程、并发数控制等功能
3 方法列表:
public static ExecutorService newFixedThreadPool(int nThreads)
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory)
public static ExecutorService newCachedThreadPool()
public static ExecutorService newCachedThreadPool(ThreadFactory threadFactory)
public static ExecutorService newWorkStealingPool()
public static ExecutorService newWorkStealingPool(int parallelism)
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize)
public static ScheduledExecutorService newScheduledThreadPool(
int corePoolSize, ThreadFactory threadFactory)
public static ExecutorService newSingleThreadExecutor()
public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory)
public static ScheduledExecutorService newSingleThreadScheduledExecutor()
public