栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

线程池工作原理及创建

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

线程池工作原理及创建

注: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());

    }

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

应用场景:定时任务

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/874468.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号