当前位置: 首页 > wzjs >正文

像乐视做硬件的视频网站吉林市城市建设档案馆官方网站

像乐视做硬件的视频网站,吉林市城市建设档案馆官方网站,做家居的网站,广州网站关键词优化推广简介 源管理的基石,其核心线程为何不会超时销毁一直是开发者关注的焦点。核心线程的永续机制不仅确保了系统的稳定响应,还避免了频繁创建和销毁线程带来的性能损耗。本文将从源码层面深入剖析线程池核心线程的存活原理,同时结合企业级实战案例,展示如何正确配置和管理线程…

简介

源管理的基石,其核心线程为何不会超时销毁一直是开发者关注的焦点。核心线程的永续机制不仅确保了系统的稳定响应,还避免了频繁创建和销毁线程带来的性能损耗。本文将从源码层面深入剖析线程池核心线程的存活原理,同时结合企业级实战案例,展示如何正确配置和管理线程池,确保核心线程始终处于就绪状态,为高并发场景提供可靠保障。

一、线程池核心概念解析

1.1 线程池基础架构

Java线程池的核心实现类是ThreadPoolExecutor,它通过七个关键参数控制线程的创建、执行和销毁过程:
在这里插入图片描述

  • 核心线程数(corePoolSize):线程池中始终保持活跃的线程数量
  • 最大线程数(maximumPoolSize):线程池能够创建的最大线程数量
  • 空闲线程存活时间(keepAliveTime):非核心线程在空闲状态下的存活时间
  • 时间单位(unit):指定keepAliveTime的时间单位
  • 任务队列(workQueue):用于存储待执行任务的阻塞队列
  • 线程工厂(threadFactory):负责创建新线程的工厂
  • 拒绝策略(handler):当线程池无法处理新任务时的应对策略

线程池的工作流程遵循"生产者-消费者"模式,任务提交者(生产者)将任务放入线程池,而线程池中的线程(消费者)则从队列中取出任务执行。核心线程的特殊之处在于它们不会因空闲而被回收,即使线程池中没有任务可执行,这些线程也会一直保持就绪状态

1.2 核心线程与非核心线程的区别

核心线程和非核心线程在行为上存在明显差异:

核心线程

  • 始终保持活跃状态,不会因空闲而被回收
  • 默认情况下,即使线程池中没有任务,核心线程也会继续等待
  • 通过workQueue.take()方法无限阻塞等待任务

非核心线程

  • 在空闲超过keepAliveTime后会被回收
  • 通过workQueue.poll(keepAliveTime, unit)方法有超时地等待任务
  • 当线程池中的线程数超过corePoolSize时创建

线程池通过ctl(一个原子整数)来跟踪线程池的状态和线程数量。ctl的低29位表示当前线程数,高3位表示线程池状态。这种设计使得线程池能够高效地管理线程的创建和销毁。

1.3 线程池的执行流程

当一个任务提交到线程池时,线程池会按照以下顺序处理:

  1. 如果当前线程数小于核心线程数,创建新线程执行任务
  2. 如果当前线程数达到或超过核心线程数,将任务放入工作队列
  3. 如果工作队列已满且当前线程数小于最大线程数,创建新线程执行任务
  4. 如果工作队列已满且当前线程数达到最大线程数,执行拒绝策略

核心线程的永续性体现在即使工作队列为空,核心线程也会继续等待新任务,而不是退出。这种机制确保了线程池能够快速响应新的任务请求,避免了每次任务到达时都需要创建新线程的开销。

二、核心线程永续机制源码剖析

2.1 Worker线程的循环执行机制

线程池中的每个线程实际上都是Worker类的实例,它继承自AbstractQueuedSynchronizer(AQS)。Worker类的核心在于它的runWorker()方法,这个方法通过无限循环确保线程持续工作:

final void runWorker(Worker w) {Thread wt = Thread.currentThread();Runnable task = w.firstTask;w.firstTask = null;w解锁();boolean completedAbruptly = true;try {while (task != null || (task = getTask()) != null) {// 执行任务beforeExecute(wt, task);Throwable thrown = null;try {task.run();} catch (RuntimeException x) {thrown = x;throw x;} finally {afterExecute(task, thrown);}}completedAbruptly = false;} finally {// 如果任务执行异常,可能需要恢复processWorkerExit(w, completedAbruptly);}
}

关键点runWorker()方法通过无限循环确保线程持续工作,只有当线程被中断或线程池被停止时才会退出循环。

2.2 getTask()方法的核心逻辑

getTask()方法是核心线程永续的关键,它决定了线程如何获取任务:

private Runnable getTask() {boolean timedOut = false; // 是否超时for (;;) {int c =ctl.get();int wc = workerCountOf(c);// 判断是否需要检测超时boolean timed = allowCoreThreadTimeOut || wc > corePoolSize;// 超时条件if ((wc > maximumPoolSize || (timed && timedOut)) && (wc > 1 || workQueue.isEmpty())) {if (compareAndDecrementWorkerCount(c)) {return null;}continue;}try {// 核心线程:无限阻塞等待任务// 非核心线程:有超时地等待任务Runnable r = timed ? workQueue.poll(keepAliveTime, TimeUnit.NANOSECONDS) : workQueue.take();if (r != null) return r;timedOut = true;} catch (InterruptedException retry) {timedOut = false;}}
}

核心逻辑

  • 当线程数不超过corePoolSize且未启用allowCoreThreadTimeOut时,timedfalse
  • 此时调用workQueue.take()无限阻塞等待任务
  • 非核心线程调用workQueue.poll(keepAliveTime, unit)有超时地等待任务
2.3 allowCoreThreadTimeOut参数的作用

allowCoreThreadTimeOut参数控制核心线程是否允许超时销毁,默认值为false。当设置为true时,核心线程也会在空闲超过keepAliveTime后被回收:

// 创建线程池时设置allowCoreThreadTimeOut
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,TimeUnit.SECONDS,new LinkedBlockingQueue<>(),threadFactory,rejectHandler,allowCoreThreadTimeOut // 这里设置是否允许核心线程超时
);

关键区别

  • allowCoreThreadTimeOut=false时,核心线程会一直等待任务,不会超时
  • allowCoreThreadTimeOut=true时,所有线程(包括核心线程)在空闲超过keepAliveTime后都会被回收
2.4 线程池关闭机制

线程池关闭时,核心线程的处理方式有所不同:

// 平滑关闭线程池,等待所有任务完成
executor.shutdown();// 强制关闭线程池,立即中断所有线程
executor.shutdownNow();

关闭机制

  • shutdown()方法将线程池状态设为SHUTDOWN,拒绝新任务,但允许已提交任务完成
  • shutdownNow()方法将线程池状态设为STOP,立即中断所有线程并返回未处理任务

核心线程的关闭

  • 只有当线程池被显式关闭(shutdown()shutdownNow())时,核心线程才会被回收
  • shutdown()过程中,核心线程会完成正在执行的任务,然后被终止
  • shutdownNow()过程中,核心线程会被立即中断

三、企业级线程池配置实战

3.1 基于业务场景的线程池参数配置

在企业级应用中,线程池的参数配置需要根据具体的业务场景进行优化。以下是不同场景下的配置建议:

CPU密集型任务

// 核心线程数设为CPU核心数
int corePoolSize = Runtime.getRuntime().availableProcessors();
// 最大线程数设为核心线程数的1.5倍
int maximumPoolSize = (int)(corePoolSize * 1.5);
// 使用直接提交队列,减少任务等待
BlockingQueue<Runnable> workQueue = new SynchronousQueue<>();
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,0L,TimeUnit.SECONDS,workQueue,new DefaultThreadFactory("cpu-intensive-"),new ThreadPoolExecutor.CallerRunsPolicy()
);

IO密集型任务

// 核心线程数设为CPU核心数的2倍
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
// 最大线程数设为核心线程数的2倍
int maximumPoolSize = corePoolSize * 2;
// 使用有界队列,防止内存溢出
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(1000);
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,60L,TimeUnit.SECONDS,workQueue,new DefaultThreadFactory("io-intensive-"),new ThreadPoolExecutor.CallerRunsPolicy()
);

高并发场景(如电商秒杀)

// 核心线程数设为CPU核心数的2倍
int corePoolSize = Runtime.getRuntime().availableProcessors() * 2;
// 最大线程数设为核心线程数的4倍
int maximumPoolSize = corePoolSize * 4;
// 使用有界队列,队列大小根据预期流量调整
BlockingQueue<Runnable> workQueue = new ArrayBlockingQueue<>(5000);
// 创建线程池
ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,30L,TimeUnit.SECONDS,workQueue,new DefaultThreadFactory("high-concurrency-"),new Custom rejectionHandler() // 自定义拒绝策略
);

参数配置原则

  • 核心线程数应与任务类型和系统资源匹配
  • 队列容量应根据预期任务量和系统内存合理设置
  • 最大线程数应为核心线程数的2-4倍,避免过多线程导致上下文切换开销
  • 拒绝策略应根据业务场景选择,如AbortPolicy(默认,抛出异常)、CallerRunsPolicy(由调用线程执行任务)、DiscardPolicy(直接丢弃任务)或DiscardOldestPolicy(丢弃队列中最旧任务)
3.2 Spring Boot线程池配置

在Spring Boot应用中,通常使用ThreadPoolTaskExecutor来创建和管理线程池:

@Configuration
@EnableAsync
public class ThreadPoolConfig {@Value("${threadPool.corePoolSize}")private int corePoolSize;@Value("${threadPool.maxPoolSize}")private int maxPoolSize;@Value("${threadPool队列容量}")private int queueCapacity;@Value("${threadPool.name}")private String namePrefix;@Bean("asyncExecutor")public Executor asyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(corePoolSize);executor.setMaxPoolSize(maxPoolSize);executor.setQueueCapacity(queueCapacity);executor.setThreadNamePrefix(namePrefix);executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.setWaitForTasksToCompleteOnShutdown(true);executor.setAwaitTerminationSeconds(60);executor.initialize();return executor;}
}

配置说明

  • corePoolSize:核心线程数,根据任务类型和系统资源设置
  • maxPoolSize:最大线程数,应为核心线程数的2-4倍
  • queueCapacity:队列容量,根据预期任务量和系统内存设置
  • namePrefix:线程名称前缀,便于监控和问题定位
  • rejectedExecutionHandler:拒绝策略,选择适合业务场景的策略
  • waitForTasksToCompleteOnShutdown:优雅关闭,等待任务完成后再关闭
  • awaitTerminationSeconds:关闭等待时间,超时后强制关闭

企业级配置建议

  • 避免使用Executors工具类创建线程池,因

文章转载自:

http://YtaHRhjD.kqxng.cn
http://1V2SUCMe.kqxng.cn
http://2zUQjPBq.kqxng.cn
http://2OZWXxfV.kqxng.cn
http://X8nQ0A1m.kqxng.cn
http://A10lq20F.kqxng.cn
http://QdJUnSv1.kqxng.cn
http://uJrL9mse.kqxng.cn
http://iJiqg1Ms.kqxng.cn
http://w23GlbKo.kqxng.cn
http://YCmUIfU3.kqxng.cn
http://6SFYTRZH.kqxng.cn
http://ZFfxCReR.kqxng.cn
http://9tKDxLzH.kqxng.cn
http://o3kSS1ap.kqxng.cn
http://o6256SYN.kqxng.cn
http://wS7dk6pI.kqxng.cn
http://vekojT4W.kqxng.cn
http://IugzzQPr.kqxng.cn
http://YUucpAhc.kqxng.cn
http://wr1l9K9e.kqxng.cn
http://dSfVKQ2H.kqxng.cn
http://SPoUhRuO.kqxng.cn
http://R3umPGNg.kqxng.cn
http://F2gby8iL.kqxng.cn
http://Sf7YRLPL.kqxng.cn
http://D9stLUHS.kqxng.cn
http://O2mOxx54.kqxng.cn
http://vazDWuT8.kqxng.cn
http://oujANQwQ.kqxng.cn
http://www.dtcms.com/wzjs/631294.html

相关文章:

  • wordpress微信公众号企业版口碑seo推广公司
  • 中国联通网站备案管理系统东莞展馆设计公司
  • 永兴网站建设做网站公司找意向客户
  • 网络营销推广咨询收费标准seo数据优化
  • 这么开网站烟台百度建网站
  • 优秀国外网站网上商城该怎么推广
  • 重庆网站备案桂林模板网站建设
  • 广西南宁网站优化网站备案服务内容
  • wordpress全站静态化宁波网页美工培训
  • 婚庆公司网站模板高端小程序建设公司
  • 企业网站开发说明wordpress的域名不备案
  • 网站seo优化合同淘宝怎么做引流和推广
  • PHP+Ajax网站开发典型实例全国做网站公司前十名
  • 物流公司网站建设系统规划那个网站建设好
  • 写文案要看的网站怎样自己做公司网站
  • 网站备案有什么好处理网站制作费用多少
  • 河源市做网站wordpress编辑写文章失败
  • 个人网站设计与实现结论滁州seo优化
  • 网站 成功案例seo排名优化北京
  • 网站优化怎样的湖南建设监理协会网站
  • 第三方网站开发优缺点优质的外国网站
  • 吉他谱网站如何建设WordPress缩略图太模糊
  • 网站建设中 英文深圳外贸建设网站
  • 如何查看一个网站的浏览量百度开放云做网站
  • 自己想做一个网站怎么做企业组织架构
  • 朋友圈海报用什么网站做的昆明优化网站公司
  • 推广业务网站建设网站建设的步骤过程视频
  • 建行手机网站新品上市的营销方案
  • html网站设计源码带后台的响应式网站
  • 网站总浏览量免费建手机商城网站