java - 在我的情况下我应该创建多少个线程?

标签 java multithreading

我在 Google 中搜索了解决方案,但对于在我的特定情况下应该使用多少线程仍然有点困惑。

我有两种线程用法。首先,我有一个包含 10 个文件的文件夹,我想并行解析这些文件(彼此独立)。其次,我有一个运行 100 个任务的共享数据对象。每个任务都包括读取数据对象和写入共享结构(HashMap)。

我应该只使用与 CPU 核心一样多的线程吗?或者我应该使用 ThreadPoolExecutor,其最小线程数等于 2,最大线程数等于 999(然后创建 100 个线程)?

最佳答案

考虑使用Executors.newCachedThreadPool() 。这将创建一个包含所需数量的线程的线程池,并重用空闲线程。

我无法告诉您将为 100 个任务创建多少个线程。如果任务执行时间较长,则会创建 100 个线程,立即并行启动所有任务。如果任务非常短或者您没有同时推送所有任务,则第一个线程将被重用来执行更多任务(而不仅仅是一个)。

顺便说一句,创建线程意味着一些成本(CPU 和内存),并且由于内核数量的限制,太多线程可能毫无用处。在这种情况下,您还可以使用 Executors.newFixedThreadPool( int nThreads ) 限制线程数。 。

一种广泛的做法是使用核心数 x 2 作为线程计数

关于java - 在我的情况下我应该创建多少个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35240164/

相关文章:

java - 这种锁定技术的名称是什么?

Java/安卓 : SQLite or file for indexing?

java - 我知道抽象/重写的静态方法在 Java 中是不可能的,但我的代码似乎需要它们

python - 从命令行调用的 python 脚本中的多个线程

ruby-on-rails - 我应该使用 Redis 哈希还是 Ruby 哈希?

multithreading - 我的代码中的随机访问违规

c# - 为什么在变量之后不进行转换?

java - 在一个比较器中对两个不同字段进行排序

c# - 为什么后台线程中未处理的异常不会使应用程序域崩溃?

java - 在 Netty ServerSocket 中获取主线程