我在 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/