有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在我的案例中应该创建多少线程?

我在谷歌上搜索了一个解决方案,但我仍然有点困惑,在我的特殊情况下应该使用多少线程

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

我应该只使用CPU核心数量的线程吗?或者我应该使用最小线程数为2,最大线程数为999的ThreadPoolExecutor(然后创建100个线程)


共 (3) 个答案

  1. # 1 楼答案

    建议使用Executors,因为在这种情况下,您应该有一个创建线程的最低阈值,并且线程将被重用,否则为每个任务创建单独的线程可能会导致创建太多线程

  2. # 2 楼答案

    考虑使用^{}。这将创建一个包含所需线程数的线程池,并重用空闲线程

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

    顺便说一句,创建一个线程意味着一些成本(cpu和内存),而且由于内核数量的限制,太多的线程可能是无用的。在这种情况下,还可以使用^{}限制线程数

    一种普遍的做法是使用number of cores x 2进行线程计数

  3. # 3 楼答案

    ThreadPoolExecutor只是应用多线程的一种更高级别的方法,虽然它的本质不会改变,但它的使用可以在管理中有所帮助

    没有真正的规则,所有这些都取决于所涉及的处理类型、IO、同步/异步任务

    通常情况下,为了评估所需/最佳线程的数量,我从线程的数量==CPU的数量开始,然后通过试验,我估计是否可以增加它们,这取决于所涉及的任务类型,稍微高一点的线程数(比内核数)可能对性能有利

    例如,您可以尝试从1.5*cpu任务开始,验证1*cpu和2*cpu的性能差异

    再见