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

从哪里设置网站关键词无锡企业自助建站系统

从哪里设置网站关键词,无锡企业自助建站系统,seo推广计划,高端网站建设kgu本文是 Java 多线程与并发核心知识中的“线程池”专题,包含官方线程池分类、自定义 ThreadPoolExecutor 参数详解、工作队列选择、拒绝策略剖析、生产实践案例与高频面试题解析,适合有基础但想进一步掌握线程池底层原理的读者,内容详尽&#…

本文是 Java 多线程与并发核心知识中的“线程池”专题,包含官方线程池分类、自定义 ThreadPoolExecutor 参数详解、工作队列选择、拒绝策略剖析、生产实践案例与高频面试题解析,适合有基础但想进一步掌握线程池底层原理的读者,内容详尽,强烈建议收藏!


一、什么是线程池?为什么使用线程池?

1.1 线程池的概念

线程池(ThreadPool)是一种线程复用机制。通过提前创建一定数量的线程,统一管理调度多个任务,避免频繁创建销毁线程带来的资源浪费。

1.2 为什么需要线程池?

  • 线程创建开销大:频繁创建/销毁线程会极大增加系统负载;
  • 线程数量不可控:无限制创建线程可能导致 OOM 或系统奔溃;
  • 任务调度不灵活:无线程池时任务由程序自己控制,难以管理。

✅ 总结一句话:线程池 = 控制资源 + 提升性能 + 提升并发吞吐能力


二、Java 官方线程池分类(Executors 提供)

名称方法特点使用场景
单线程池Executors.newSingleThreadExecutor()只有一个线程,所有任务按顺序执行日志记录、事件序列
固定线程池Executors.newFixedThreadPool(n)固定线程数量,任务超出排队后台服务处理请求
缓存线程池Executors.newCachedThreadPool()无限制线程,空闲线程 60s 销毁高并发短任务
定时线程池Executors.newScheduledThreadPool(n)延迟执行、周期执行任务定时器、调度器
工作窃取池Executors.newWorkStealingPool()多核并行,自动分配线程并行计算、大任务拆分

⚠️ 注意:Executors 创建的线程池容易造成 OOM!如:CachedThreadPool + LinkedBlockingQueue 无界。强烈推荐手动创建 ThreadPoolExecutor


三、ThreadPoolExecutor 构造函数 + 所有方法详解

3.1 七个参数构造函数(推荐)

ThreadPoolExecutor executor = new ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);

3.2 参数解释

参数含义
corePoolSize核心线程数,始终存活
maximumPoolSize最大线程数(任务高峰使用)
keepAliveTime非核心线程空闲销毁时间
unit时间单位(秒、毫秒等)
workQueue缓冲队列,存放待执行任务
threadFactory自定义线程工厂,给线程命名等
handler拒绝策略(线程池 & 队列都满了)

3.3 常用方法一览

  • execute(Runnable task):提交任务(无返回值)
  • submit(Callable/Void):提交任务(有 Future 返回)
  • shutdown():优雅关闭线程池(执行完现有任务)
  • shutdownNow():立即停止,返回未执行任务列表
  • getCorePoolSize():获取核心线程数量
  • getMaximumPoolSize():获取最大线程数
  • getActiveCount():获取当前活跃线程数
  • getQueue().size():查看等待队列中任务数量
  • prestartCoreThread():提前启动一个核心线程
  • allowCoreThreadTimeOut(true):允许核心线程超时销毁

四、五参数与七参数构造方式对比

4.1 五参数构造方式

new ThreadPoolExecutor(core, max, time, unit, workQueue);

问题:使用默认线程工厂与默认拒绝策略,灵活性差。

4.2 七参数构造方式(推荐)

ThreadPoolExecutor executor = new ThreadPoolExecutor(4, 10, 60, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()
);

推荐指定线程名 + 合理拒绝策略,方便排查问题


五、拒绝策略详解(RejectedExecutionHandler)

策略类名行为适用场景
AbortPolicy(默认)ThreadPoolExecutor.AbortPolicy抛出异常非关键任务,容忍失败
CallerRunsPolicyThreadPoolExecutor.CallerRunsPolicy提交线程自己执行降低任务提交速度
DiscardPolicyThreadPoolExecutor.DiscardPolicy静默丢弃任务任务非必须、丢了也没事
DiscardOldestPolicyThreadPoolExecutor.DiscardOldestPolicy丢最旧任务,插入当前任务实时性任务,不能等

✅ 生产建议:使用 CallerRunsPolicy + 日志记录,避免系统挂掉


六、任务队列 workQueue 类型与区别

队列类名特点说明
ArrayBlockingQueue有界 FIFO固定长度,线程安全
LinkedBlockingQueue有界/无界默认无界,可能造成内存泄露
SynchronousQueue不存任务每个任务必须直接交给线程执行
PriorityBlockingQueue带优先级支持自定义优先级任务

七、线程工厂 ThreadFactory 自定义线程名

ThreadFactory factory = new ThreadFactory() {private final AtomicInteger count = new AtomicInteger(1);@Overridepublic Thread newThread(Runnable r) {return new Thread(r, "my-thread-" + count.getAndIncrement());}
};

八、最佳实践配置方案(阿里开发手册建议)

  • 核心线程数:CPU核数 + 1
  • 最大线程数:看业务量 & 延迟容忍度
  • 队列长度:根据 QPS 测算
  • 拒绝策略:CallerRunsPolicy + 日志
  • 禁止 Executors 创建线程池,务必手动配置

九、实战案例:自定义线程池完整代码

ThreadPoolExecutor pool = new ThreadPoolExecutor(4, 10,60, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100),Executors.defaultThreadFactory(),new ThreadPoolExecutor.CallerRunsPolicy()
);for (int i = 0; i < 200; i++) {final int taskId = i;pool.execute(() -> {System.out.println(Thread.currentThread().getName() + " 正在执行任务:" + taskId);try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}});
}pool.shutdown();

🔥 十、线程池高频面试题解析(附答案)

1. corePoolSizemaximumPoolSize 有什么区别?

  • corePoolSize 是“始终保留”线程,即使无任务;
  • maximumPoolSize 是线程池最大线程数量(任务高峰期临时扩容使用)。

2. 拒绝策略有哪些?各自适合场景?

详见上方第五节(AbortPolicy、CallerRunsPolicy、DiscardPolicy、DiscardOldestPolicy)


3. 为什么不建议使用 Executors 创建线程池?

  • Executors 创建的线程池如 CachedThreadPool 默认使用无界队列,可能造成 OOM。
  • 固定线程数可能阻塞任务。

4. 如何优雅关闭线程池?

  • 使用 shutdown():等任务执行完再退出
  • 使用 shutdownNow():立即终止,返回未执行任务列表
  • 推荐:shutdown() + awaitTermination() 配合

5. 工作队列选择会对线程池行为产生哪些影响?

  • 队列是否有界直接决定线程池能否控制内存;
  • 不同队列(如 ArrayBlockingQueue、SynchronousQueue)对任务调度机制有明显影响;
  • SynchronousQueue 会跳过队列,直接尝试交给线程执行,适合高并发短任务;
  • LinkedBlockingQueue 默认无界,可能造成任务堆积导致 OOM;
  • 合理选择队列类型,搭配线程数与拒绝策略才能实现最佳性能与安全性。


文章转载自:

http://bovjkbz0.bpmdg.cn
http://jF4ODBi3.bpmdg.cn
http://MhSOLMu9.bpmdg.cn
http://0zHCXnNZ.bpmdg.cn
http://ci150bAW.bpmdg.cn
http://Upy6f9ij.bpmdg.cn
http://7VYH9ogY.bpmdg.cn
http://o2VtXHtd.bpmdg.cn
http://TFEGSF4p.bpmdg.cn
http://4tpgs1G0.bpmdg.cn
http://xbJ9H2Gi.bpmdg.cn
http://ycDkBbic.bpmdg.cn
http://TA606fAC.bpmdg.cn
http://tM2lffGW.bpmdg.cn
http://DCn9CV9T.bpmdg.cn
http://X1ovVADy.bpmdg.cn
http://gy8Of0kX.bpmdg.cn
http://fMggEzZD.bpmdg.cn
http://XCYDg7Tg.bpmdg.cn
http://GktRkHzq.bpmdg.cn
http://uxHfwa0i.bpmdg.cn
http://iXVyAhvP.bpmdg.cn
http://QEBEau6q.bpmdg.cn
http://uzHXxLcM.bpmdg.cn
http://NIiNmH9x.bpmdg.cn
http://S212fYTE.bpmdg.cn
http://UJYtdMJn.bpmdg.cn
http://eHv3Y7uy.bpmdg.cn
http://vkf9vosG.bpmdg.cn
http://uJETHBGW.bpmdg.cn
http://www.dtcms.com/wzjs/767026.html

相关文章:

  • 易讯企业建站系统网站建设报价多少
  • 南宁住房和城乡建设部网站北京建设工程信息网查询
  • 企业网站改版新闻建筑设计的主要内容
  • 英文网站建设图片沧州app商城定制开发
  • 网站建设网站需求分析报告功能茶叶网站建设
  • c 大型网站开发案例高权重网站出售
  • 安全生产标准化建设网站专门做招商的网站
  • 宁波自己建网站seo是什么意思紧要
  • 创网网站后台管理系统wordpress 浏览量排序
  • 做期货网站违法的吗陕西省建设厅执业资格注册中心网站
  • 做网站客户要提供什么网站做seo需要些什么软件
  • 网站一般宽度网站如何交换链接
  • 衡水企业网站建设公司快速生成html模板
  • python开发做网站wordpress分类多重筛选
  • 商家做网站的优点有哪些做壁纸的网站
  • 做美食直播哪个网站好青岛建网站的公司
  • 织梦网站怎么搬家企业网站公司单位有哪些
  • 淘宝网站建设单子好接吗河南县wap网站建设公司
  • 昆明网站建设怎么样wordpress所需系统
  • 做网站挣钱吗公司的企业文化怎么写
  • 网上做造价网站外发加工网站
  • o2o商城网站搭建监理网站
  • 违法网站建设国外服务器想看别人的wordpress博客网站
  • 做外汇消息面的网站做网站的eclip
  • 阿里云自助建站教程php构建网站
  • 长春做网站多少钱建设机械网站方案设计
  • 启闭机闸门的网站建设网站建设做什么科目
  • 如何做登录网站建设人行官方网站
  • 网站域名后缀的意思微信运营商
  • 网站建设构造学习网站建设科