最多能拆分成多少个线程去执行任务?假如我数字太多,拆分的线程会不会太多?最终拆分成10万个线程了?
Topic source我懂了,线程数的数量我们可以自己控制的。
1. 请看图,多图杀猫预警。
2. commonPool()方法的线程数量是怎么设置的?
看懂了没?commonPool()方法的线程数量,实际上是CPU的核数减1。default 1 less than #cores
对了,by the way ,顺便问一下,你们知道评论怎么上传图片啊。廖老师这个教程评论区,好像不支持上传图片啊。
任务是进入队列,10万个任务也是先进了队列再慢慢执行;
pool的线程数才是执行任务的,commonPool就是cpu数量-1,如果自己创建就是自己指定的值;
ForkJoin是让你做计算密集型任务的,不可能拆10万,那样没有意义;
如果是10万IO密集型任务,直接扔到Executor里执行,不要用ForkJoin:
ExecutorService executor = Executors.newFixedThreadPool(200);
不要纠结底层细节,JDK代码到处都有优化,看起来费劲;
先用对,早下班早休息。
我用ForkJoinPool.commonPool().invoke(task);,将任务拆分成上千个任务,把线程的名字打印出来,可以看到即使有上千个任务,也最多有30个线程在执行,不知道为什么。感觉commonPool的线程数不是CPU核数减一啊,廖老师。
你看到的是线程的名字,有30个线程不表示正在运行的是30个线程。建议你读文档,不要从自己跑的结果倒推结论。
ForkJoinPool的几个方法:
-
int getPoolSize()
-
int getRunningThreadCount()
-
int getActiveThreadCount()
一定要读文档,比如写了Returns an estimate of the number of threads就说明返回的活动线程数是“大约”不是准确的。
- 1
跟人不要讲道理讲感情
最多能拆分成多少个线程去执行任务?假如我数字太多,拆分的线程会不会太多?最终拆分成10万个线程了?