实际项目中如何使用线程池

322 天前
 baolinliu442k

工作后,接触过定义线程池的情况只有全局一个线程池,由前辈设置,自己用就可以了。再就是使用 Springboot 提供的 @Async ,想知道大家一般在生产中的线程池是怎么定义的和使用的

  1. 线程池定义在哪里,是全局( xxThreadUtil )还是业务类(xxxService 的 private static)里面
  2. 单个线程池执行所有任务好像不太合适,应该不止一个线程池,多个线程池的话是按什么分类和分配线程池参数的呢
  3. 在一个项目里定义多个线程池感觉主要是为了线程不会相互依赖,性能上应该不会提升?
  4. 执行任务的方式,使用线程池的 submit 、execute ? 或者 CompleteableFeature?

感觉多线程这一块的技术还是非常多内容,无论是思想还是实细节,我常常在想 node 真的好优雅啊,提供简单的 api 就很方便实现异步执行,其他语言里面好像要知道很多细节才可以编写多线程代码

由于本人技术菜单一批,可能有的问题比较蠢,恳请大家不吝赐教

5062 次点击
所在节点    Java
43 条回复
GloryJie
321 天前
在 BFF 层聚合数据的时候用的多,一般会同时调好几个接口。这边使用上线程池一般都托管给 Spring 。
最近在改造成基于 Dag 来编排任务执行了,不过基础还是让线程池执行
TuringHero
321 天前
spring:
threads:
virtual:
enabled: true
hdfg159
321 天前
Spring Boot 3.2 打开虚拟线程开关,你都不用管了,直接 @Async 注解无脑用了
baolinliu442k
321 天前
@siweipancc 没有,觉得 await 和 async 关键字挺好的
baolinliu442k
321 天前
@ffw5b7 这篇之前也看过
baolinliu442k
321 天前
@qhkobold 老项目 java8,我自己项目的话,我就直接 new Thread().start 了 哈哈
baolinliu442k
321 天前
@chendy 嗯嗯,公司的项目我还不敢随便配
baolinliu442k
321 天前
@blankmiss 哈哈不知道
baolinliu442k
321 天前
@joyhub2140 就是不知道用啥感觉
baolinliu442k
321 天前
@kuituosi 感谢回答,就是感觉 Node 单线程可以很方便进行异步挺好的,而且我也不知道啥算 CPU 密集型
baolinliu442k
321 天前
@CodeCodeStudy 嗯嗯,可是项目中定义线程池还是蛮普遍的
baolinliu442k
321 天前
@oneronan 感谢回答
baolinliu442k
321 天前
@Aresxue 谢谢回答, 我还有个疑问如果一个项目中定义了多个线程池,例如 2 个线程池,核心线程数都是 5 ,机器 cpu 核数是 5 , 那么可以同时执行 10 个任务吗? 线程池定义多了是不是作用不大了
baolinliu442k
321 天前
@nothingistrue 大佬,我茅厕顿开
baolinliu442k
321 天前
@Seulgi 确实需要慎用, 目前公司做的 toB 业务,一个大接口响应 10s 都不要优化
baolinliu442k
321 天前
@imokkkk 谢谢回答,感谢贴出代码, 很有参考意义
baolinliu442k
321 天前
@TuringHero 感觉 java 已经很先进了, 然而项目还是 java8hah
baolinliu442k
321 天前
@hdfg159 这么爽的嘛
ymy3232
321 天前
我们线上业务不复杂但是并发高而且时长要求严格,项目全局用一个公共的线程池,包括 springweb 和 CompleteableFuture 等一些组件的默认线程池都替换了,好处坏处都有,视项目而定
Plutooo
321 天前
可以看一下 rocketmq 源码里面是如何使用线程池的,全局搜索一下就可以

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1006600

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX