线程池工作原理及创建

线程池工作原理及创建,第1张

注:JDK1.8版本

线程池7个构造参数

线程池构造方法:

public ThreadPoolExecutor(int corePoolSize,

                              int maximumPoolSize,

                              long keepAliveTime,

                              TimeUnit unit,

                              BlockingQueue workQueue,

                              ThreadFactory threadFactory,

                              RejectedExecutionHandler handler)

1.corePoolSize 线程核心线程数(线程池中保留的线程数,即使它们是空闲的,默认情况下不会回收,除非设置allowCoreThreadTimeOut为true

allowCoreThreadTimeOut设置true时,会中断所有核心线程

interruptIdleWorkers(boolean) : void - java.util.concurrent.ThreadPoolExecutor

     interruptIdleWorkers() : void - java.util.concurrent.ThreadPoolExecutor

         allowCoreThreadTimeOut(boolean) : void - java.util.concurrent.ThreadPoolExecutor

2.maximumPoolSize 线程池中允许的最大线程数(maximumPoolSize = corePoolSize 不会有额外的创建线程,只有核心线程在工作)

 

3.keepAliveTime 线程空闲时间(线程数大于核心线程,剩余空闲线程最大等待时间)

4.unit 线程空闲时间单位

5.workQueue 线程池队列(线程池相关队列SynchronousQueue,LinkedBlockingQueue,DelayedWorkQueue )用于存放线程任务

SynchronousQueue :同步阻塞队列

分为两种模式,默认是非公平模式

公平模式:TransferQueue,队列任务先进先出

非公平模式:TransferStack,队列任务先进后出

队列任务添加满时,阻塞队列;队列任务消费为空时,阻塞队列

6.threadFactory 线程工厂用于创建线程

7.handler 拒绝策略

AbortPolicy:抛出java.util.concurrent.RejectedExecutionException异常

CallerRunsPolicy:用于被拒绝任务的处理程序,它直接在execute方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务

DiscardOldestPolicy:丢弃任务队列中最旧任务

DiscardPolicy:丢弃当前将要加入队列的任务

线程池工作原理
  1. execute 添加线程任务
  2. addWorker 创建执行线程的worker
  3. t.start() 开启工作任务
  4. task.run() 执行]线程任务

创建线程池4种情况 1.newCachedThreadPool 缓存线程池

new ThreadPoolExecutor(0, Integer.MAX_VALUE,

                                      60L, TimeUnit.SECONDS,

                                      new SynchronousQueue())

注:缓存线程池是一个无线扩容的线程池(核心线程为0,最大线程数不受限制),默认空闲时间60s,超过空闲时间时回收线程;线程没有回收前可重复利用

应用场景:流量洪峰且线程处理时间端(处理任务速度 > 提交任务速度,耗时少的任务)

2.newFixedThreadPool 固定线程池

 注:固定大小线程池(核心线程=最大线程),没有空闲线程,默认情况核心线程不会回收,默认情况队列无上限,大量线程任务进入队列可能导致内粗溢出

应用场景:限流处理减少系统承受压力(受内存限制,量少且任务急增情况,建议用在访问外部系统)

3.newSingleThreadExecutor 单例线程池

public static ExecutorService newSingleThreadExecutor(ThreadFactory threadFactory) {

return new FinalizableDelegatedExecutorService

            (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS,

           new LinkedBlockingQueue(),  threadFactory));}

注:单列线程池(核心线程=最大线程=1)只有一个线程执行任务,没有空闲线程,默认情况核心线程不会回收,默认情况队列无上限,大量线程任务进入队列可能导致内粗溢出

应用场景:执行任务有先后顺序(量少且无时效场景)

4.newScheduledThreadPool 周期性线程池

public ScheduledThreadPoolExecutor(int corePoolSize) {

        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,

              new DelayedWorkQueue());

    }

注:周期性线程池(自定义核心线程,最大线程数量不限制);非核心线程执行完立马回收,默认情况队列无上限且有延迟效果

应用场景:定时任务

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/905931.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-15
下一篇2022-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存