2021-05-09
jdk修改默认并行计算线程池的线程数
java 评论:0 浏览:35

转载请注明出处:https://oldnoop.tech/c/204.html

ForkJoinPool中的common Pool

是static静态初始化代码块中创建,默认使用cpu核数减1作为线程数,注意是 cpu核数 "减1"

调用ForkJoinPool之后,就很难修改,因为本身没有提供修改common Pool的入口

而且有其他开源框架和组件会采用它 并在本地静态初始化引用了它

结论:

最好在启动的时候就是用启动参数设置,这是最保险的,

原因:

就算修改了ForkJoinPool的common pool, 其他框架在本地保留的之前的引用,也没有被修改,那其他框架还是用的之前的那个common pool

如果在运行过程中了,也就只能采用一种折中的侵入式修改,

但是这也是不保险的,只能为某些通用的计算密集型场景提供更多的线程数, 但是其他开源框架和组件使用了common pool,还是使用之前在自身内部初始化的一份副本,

这里演示一下:

首先反射调用ForkJoinPool的makeCommonPool创建一个pool

有个吐槽的点, 这里使用JSR-292的反射框架invoke,不过有点糟糕, 特么私有方法就异常,还得reflect,invoke还得jdk9,开发场景多数还是jdk8啊,

特么长项也就动态修改方法签名呢,都能动态生成字节码呢,动态修改个方法签名有存在价值:))

然后反射调用修改属性

1.主要是ForkjoinPool的common和commonParallelism,搞什么static final 这么严格,还特么static{}静态初始化:))

2.还有CompletableFuture的asyncPool,这里就是上面说的其他组件使用common pool 在自身内部初始化了一份, 搞什么static final 这么严格,还特么直接初始化,每次动态获取不好吗:))

 

 



  • 转载请注明出处:https://oldnoop.tech/c/204.html
验证码

Copyright © 2018 oldnoop.tech. All Rights Reserved

鄂ICP备18003018号