Discuss / Java / 最多能拆分成多少个线程去执行任务?假如我数字太多,拆分的线程会不会太多?最终拆分成10万个线程了?

最多能拆分成多少个线程去执行任务?假如我数字太多,拆分的线程会不会太多?最终拆分成10万个线程了?

Topic source

最多能拆分成多少个线程去执行任务?假如我数字太多,拆分的线程会不会太多?最终拆分成10万个线程了?

我懂了,线程数的数量我们可以自己控制的。

ForkJoinPool在JDK17上挂起的bug

1.  请看图,多图杀猫预警。

Java的Fork/Join任务,你写对了吗?

2. commonPool()方法的线程数量是怎么设置的?

ForkJoinPool在JDK17上挂起的bug

看懂了没?commonPool()方法的线程数量,实际上是CPU的核数减1。default 1 less than #cores

对了,by the way ,顺便问一下,你们知道评论怎么上传图片啊。廖老师这个教程评论区,好像不支持上传图片啊。

廖雪峰

#3 Created at ... [Delete] [Delete and Lock User]

任务是进入队列,10万个任务也是先进了队列再慢慢执行;

pool的线程数才是执行任务的,commonPool就是cpu数量-1,如果自己创建就是自己指定的值;

ForkJoin是让你做计算密集型任务的,不可能拆10万,那样没有意义;

如果是10万IO密集型任务,直接扔到Executor里执行,不要用ForkJoin:

ExecutorService executor = Executors.newFixedThreadPool(200);

不要纠结底层细节,JDK代码到处都有优化,看起来费劲;

先用对,早下班早休息。

廖老师,你是不是删除我的评论了?为什么我自己的一些评论找不到了?是不是我上传图片太多了?

我用ForkJoinPool.commonPool().invoke(task);,将任务拆分成上千个任务,把线程的名字打印出来,可以看到即使有上千个任务,也最多有30个线程在执行,不知道为什么。感觉commonPool的线程数不是CPU核数减一啊,廖老师。

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

你看到的是线程的名字,有30个线程不表示正在运行的是30个线程。建议你读文档,不要从自己跑的结果倒推结论。

ForkJoinPool的几个方法:

  • int getPoolSize()

  • int getRunningThreadCount()

  • int getActiveThreadCount()

一定要读文档,比如写了Returns an estimate of the number of threads就说明返回的活动线程数是“大约”不是准确的。


  • 1

Reply