我在谷歌搜索了一个解决方案,但我仍然对我在特定情况下应该使用多少线程感到困惑。
我有两个线程用法。首先,我有一个包含10个文件的文件夹,我想要并行解析(彼此独立)。其次,我有一个共享数据对象,运行100个任务。每个任务都包括读取数据对象和写入共享结构(HashMap)。
我应该只使用与CPU内核一样多的线程吗?或者我应该使用ThreadPoolExecutor,最小线程数等于2,最大数量等于999(然后创建100个线程)?
答案 0 :(得分:2)
考虑使用Executors.newCachedThreadPool()
。这将创建一个线程池,其中包含所需的线程数并重用空闲线程。
我无法告诉你将为你的100个任务创建多少个线程。如果任务执行时间很长,将创建100个线程以立即并行启动所有任务。如果任务很短或者你没有在同一时刻推送所有任务,第一个线程将被重用来执行更多任务(而不仅仅是一个)。
顺便说一句,创建一个线程意味着一些成本(cpu和内存),并且由于内核数量的限制,太多线程可能无用。在这种情况下,您还可以使用Executors.newFixedThreadPool( int nThreads )
限制线程数。
广泛的做法是使用number of cores x 2
作为线程数
答案 1 :(得分:0)
ThreadPoolExecutor只是一种更高级别的方式来应用多线程,这种物质不会改变,但它的使用对管理有帮助。
没有真正的规则都取决于所涉及的处理类型,IO,同步/异步任务。
通常用于批量处理以评估所需/最佳线程的数量我从一些线程开始==数量的CPU然后通过试用我估计是否可以有益增加它们,具体取决于涉及的任务类型略高线程数(比核心数)可以有利于性能
例如,你可以尝试从1.5 * cpu任务开始,用1 * cpu和2 * cpu验证性能差异
再见
答案 2 :(得分:0)
建议使用Executors,因为在这种情况下,您应该有一个创建线程的最小阈值,线程将被重用,否则为每个任务创建单独的线程可能会导致创建太多线程。