Java并发编程中的Executor框架与性能-java教程

future不触发get()的常见原因有三:线程池已关闭导致任务被拒绝;cachedthreadpool中快速任务被误判为未执行;runnable提交后get()恒返回null。

ExecutorService.submit() 返回的 Future 为什么有时不触发 get()

调用 submit() 后没立刻 get(),任务看似“没执行”,其实是线程池未启动或任务被拒绝。常见原因有三:
• 线程池已 shutdown() 或 shutdownNow(),新任务直接走 RejectedExecutionHandler(默认抛 RejectedExecutionException)
• 使用了 Executors.newCachedThreadPool() 但任务极快结束,导致线程在你观察前就回收了,误以为没运行
• 提交的是 Runnable 而非 Callable,submit(Runnable) 返回的 Future 的 get() 永远返回 null,不抛异常也不阻塞——容易误判为“没生效”

FixedThreadPool 的 corePoolSize 和 maxPoolSize 相等,但队列满了仍会拒绝任务

很多人以为 Executors.newFixedThreadPool(n) 是“绝对稳定”的,其实它底层用的是 LinkedBlockingQueue(无界队列)。问题出在:当队列持续积压(比如下游处理慢、任务生成快),JVM 堆内存可能被撑爆;而一旦你手动换成有界队列(如 ArrayBlockingQueue(100)),且没配自定义拒绝策略,任务就会在队列满时立即被拒绝——不是线程不够,是队列挡在前面。
• 必须显式传入 ThreadPoolExecutor 构造器才能控制队列类型和拒绝策略
• newFixedThreadPool 的“固定”只指线程数,不保证任务不丢失

CompletableFuture.runAsync() 默认用 ForkJoinPool.commonPool(),别在 CPU 密集型任务里乱用

CompletableFuture 的异步方法若不指定 Executor,默认走 ForkJoinPool.commonPool()。这个池子大小通常等于 CPU 核数(Runtime.getRuntime().availableProcessors() - 1),适合并行计算类任务;但如果你用它跑大量 IO 或阻塞操作(比如 Thread.sleep()、数据库查询、HTTP 调用),会导致 commonPool 线程长时间占用,拖垮整个应用的并行流(parallelStream())甚至其他 CompletableFuture 链。
• IO 密集型任务务必传自定义 ExecutorService,例如:

ExecutorService ioExecutor = Executors.newCachedThreadPool();

• 不要用 commonPool() 处理任何可能阻塞的操作

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Java并发编程中的Executor框架与性能-java教程
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006202+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4006203+
  • 本周更新: 0+
  • 最后更新: 2026-03-16