java中的线程池是如何实现的

本文详细介绍了Java线程池的工作机制,包括线程池中线程和任务的管理,核心参数如corePoolSize、maximumPoolSize、keepAliveTime等的作用,并对比了FixedThreadPool、SingleThreadExecutor、CachedThreadPool等常见线程池的区别。同时,讨论了如何通过execute()和submit()提交线程以及volatile关键字的并发特性。
摘要由CSDN通过智能技术生成

1 : Java 中 的 线 程 池 是 如 何 实 现 的 ?
·在 Java 中 , 所 谓 的 线 程 池 中 的 “ 线 程 ” , 其 实 是 被 抽 象 为 了

一 个 静 态 内 部 类 Worker, 它 基 于 AQS 实 现 , 存 放 在 线 程 池 的

HashSet workers 成 员 变 量 中 ; 而 需 要 执 行 的 任 务 则 存 放 在 成 员 变 量 workQueue ( BlockingQueue workQueue) 中 。

这 样 , 整 个 线 程 池 实 现 的 基 本 思 想 就 是 : 从 workQueue 中 不 断 取 出 需 要 执 行 的 任 务 , 放 在 Workers 中 进 行 处 理 。

2: 创 建 线 程 池 的 几 个 核 心 构 造 参 数 ?
Java 中 的 线 程 池 的 创 建 其 实 非 常 灵 活 , 我 们 可 以 通 过 配 置 不 同 的 参 数 , 创 建 出 行 为 不 同 的 线 程 池 , 这 几 个 参 数 包 括 :

corePoolSize: 线 程 池 的 核 心 线 程 数 。

maximumPoolSize: 线 程 池 允 许 的 最 大 线 程 数 。

keepAliveTime: 超 过 核 心 线 程 数 时 闲 置 线 程 的 存 活 时 间 。

workQueue: 任 务 执 行 前 保 存 任 务 的 队 列 , 保 存 由 execute 方 法 提 交

的 Runnable 任 务 。

3: 线 程 池 中 的 线 程 是 怎 么 创 建 的 ?
是 一 开 始 就 随 着 线 程 池 的 启 动 创 建 好 的 吗 ?显 然 不 是 的 。 线 程 池 默 认 初 始 化 后 不 启 动 Worker, 等 待 有 请 求 时 才 启 动 。 每 当 我 们 调 用 execute() 方 法 添 加 一 个 任 务 时 , 线 程 池 会 做 如 下 判 断 :

·如 果 正 在 运 行 的 线 程 数 量 小 于 corePoolSize, 那 么 马 上 创 建 线 程 运 行 这 个 任 务 ; 如 果 正 在 运 行 的 线 程 数 量 大 于 或 等 于 corePoolSize,

那 么 将 这 个 任 务 放 入 队 列 ;

如 果 这 时 候 队 列 满 了 , 而 且 正 在 运 行 的 线 程 数 量 小 于maximumPoolSize, 那 么 还 是 要 创 建 非 核 心 线 程 立 刻 运 行 这 个 任 务 ;

如 果 队 列 满 了 , 而 且 正 在 运 行 的 线 程 数 量 大 于 或 等 于maximumPoolSize, 那 么 线 程 池 会 抛 出 异 常 RejectExecutionException。当 一 个 线 程 完 成 任 务 时 , 它 会 从 队 列 中 取 下 一 个 任 务 来 执 行 。 当 一 个线 程 无 事 可 做 , 超 过 一 定 的 时 间 ( keepAliveTime) 时 , 线 程 池 会 判断 。

如 果 当 前 运 行 的 线 程 数 大 于 coreP

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值