我在Google上搜索了一个解决方案,但对于在特定情况下应该使用多少个线程,我仍然有些困惑。
我有两种线程用法。首先,我有一个包含10个文件的文件夹,我要并行解析(彼此独立)。其次,我有一个共享数据对象,可在其中运行100个任务。每个任务包括读取数据对象和写入共享结构(HashMap)。
我应该只使用与CPU内核一样多的线程吗?还是我应该使用ThreadPoolExecutor,其最小线程数等于2,最大线程数等于999(那么将创建100个线程)?
最佳答案
考虑使用Executors.newCachedThreadPool()
。这将创建具有所需线程数的线程池,并重新使用空闲线程。
我无法告诉您要为100个任务创建多少个线程。如果任务很难执行,将创建100个线程以立即并行启动所有任务。如果任务很短,或者您没有同时推送所有任务,则第一个线程将被重用于执行更多任务(而不仅仅是一个)。
顺便说一句,创建线程意味着一些成本(cpu和内存),并且由于内核数量的限制,太多线程可能是无用的。在这种情况下,还可以使用Executors.newFixedThreadPool( int nThreads )
限制线程数。
普遍的做法是使用number of cores x 2
进行线程计数
关于java - 我应该创建多少个线程?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35240164/