线程池

发布于 2022年 05月 19日 17:39

线程池 ThreadPoolExecutor 的7大核心参数:

1. corePoolSize 核心线程数目 - 池中会保留的最多线程数。

2. maximumPoolSize 最大线程数目 - 核心线程+救急线程的最大数目。

3. keepAliveTime 生存时间 - 非核心线程的生存时间,生存时间内没有新任务,此线程资源会释放。

4. unit 时间单位 - 非核心线程的生存时间单位,如秒、毫秒等。

5. workQueue - 当没有空闲核心线程时,新来任务会加入到此队列排队,队列满会创建非核心线程执行任务。

6. threadFactory 线程工厂 - 可以定制线程对象的创建,例如设置线程名字、是否是守护线程等。

7. handler 拒绝策略 - 当所有线程都在繁忙,workQueue 也放满时,会触发拒绝策略。

(1)抛异常 java.util.concurrent.ThreadPoolExecutor.AbortPolicy。

(2)由调用者执行任务 java.util.concurrent.ThreadPoolExecutor.CallerRunsPolicy。

(3)丢弃任务 java.util.concurrent.ThreadPoolExecutor.DiscardPolicy。

(4)丢弃最早排队任务 java.util.concurrent.ThreadPoolExecutor.DiscardOldestPolicy。

 

线程池的创建方式:

1. Executors.newSingleThreadExecutor(),实际创建时,创建的就是ThreadPoolExecutor,对其进行了封装(代理、装饰),核心线程数和最大线程数为 1的单线程线程池

new Executors.FinalizableDelegatedExecutorService(new ThreadPoolExecutor(1, 1,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()));

2. Executors.newCachedThreadPool(),实际创建时,创建的就是ThreadPoolExecutor,核心线程数为0,最大线程数为 (2^31-1), 存活时间为60s,SynchronousQueue在此仅用于阻塞,不会进行何的缓存的可变线程线程池

new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>());

3. Executors.newFixedThreadPool(int nThreads),实际创建时,创建的就是ThreadPoolExecutor,核心线程数为 nThreads,最大线程数为 nThreads固定线程线程池

new ThreadPoolExecutor(nThreads, nThreads,0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());

 

4. Executors.newScheduledThreadPool(int corePoolSize),实际创建时,创建的就是ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,核心线程数为corePoolSize,最大线程数为 (2^31-1), DelayedWorkQueue在此仅用于延时,通过从延时队列取任务时,进行阻塞,达到执行时间后再执行的定时执行线程线程池

super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,  new ScheduledThreadPoolExecutor.DelayedWorkQueue());

5. Executors.newSingleThreadScheduledExecutor(),实际创建时,创建的就是ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,核心线程数为1,最大线程数为 (2^31-1), DelayedWorkQueue在此仅用于延时,通过从延时队列取任务时,进行阻塞,达到执行时间后再执行的单线程定时执行线程池

new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1));

6. Executors.newWorkStealingPool() ((jdk1.8才有的),实际创建时,创建的是ForkJoinPool,根据当前CPU⽣成线程池。通过work-stealing(工作窃取算法),暂不清楚。 

new ForkJoinPool(Runtime.getRuntime().availableProcessors(), ForkJoinPool.defaultForkJoinWorkerThreadFactory, null, true);

7.使用ThreadPoolExecutor创建,是最原始的线程池创建,上面1-3创建方式都是对ThreadPoolExecutor的封装。

推荐文章