得要明白线程池的基础结构
创建函数:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) { this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, Executors.defaultThreadFactory(), defaultHandler); }
描述:线程池结构分两个部分一个多个正在运行的线程(工作线程),一个就是等待运行的队列(等待队列)(是不是跟秒杀神似,其实应该说秒杀跟它神似)
corePoolSize
线程池启动时一次性启动线程数量
maximumPoolSize
线程池运行过程中最多运行线程数量,多了直接进入等待队列。
keepAliveTime
线程会由于需要其他资源处于等待,比如等到输入,等待超过这个时间,线程会被停止。
unitkeepAliveTime的时间单位
workQueue
等待运行队列
Executors.defaultThreadFactory()
ThreadFactory 一般用它给线程命名
newFixedThreadPool(本人使用最多)
创建函数:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); }
描述:创建定长线程池
说明:
corePoolSize=maximumPoolSize=nThreads
LinkedBlockingQueue
linked无数量限制,Block阻塞的
1.新来线程立刻就投入运行,大于nThreads,进入等待队列。
问题:
1.等待队列越来越多。
newCachedThreadPool
创建函数:
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); }
描述:创建无限大线程池
说明:
corePoolSize=0;
maximumPoolSize=最大整数
问题:
1.无限线程运行,一个线程需要一部分的内存,最后不行了就OOM
newScheduledThreadPool(不常用)
创建函数:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); }
public ScheduledThreadPoolExecutor(int corePoolSize) { super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS, new DelayedWorkQueue()); }
描述:创建定长线程池,周期定时执行
说明:略
问题:略