Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/402.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将工作负载分配给员工的最佳策略_Java_Multithreading_Data Processing - Fatal编程技术网

Java 将工作负载分配给员工的最佳策略

Java 将工作负载分配给员工的最佳策略,java,multithreading,data-processing,Java,Multithreading,Data Processing,我有大量的数据,我必须处理这些数据,我想使用多线程方法。 假设我有1_000_000个对象,它们必须被处理,我有大小为4(8,16)的线程池 分配此工作负载的最佳策略是什么?我能想到两件事: 对于executor服务,每个对象=1个任务。这似乎是最糟糕的决定,即使与在一个线程中处理所有内容相比也是如此 将对象的总数除以工人数。例如,如果有4名工人,每人将获得25万件物品进行处理。这是非常简单的,在我看来,可以有一些其他的选择 请分享您的想法和其他方法(可能使用FJP会更有效)您考虑过一些特殊情况

我有大量的数据,我必须处理这些数据,我想使用多线程方法。 假设我有1_000_000个对象,它们必须被处理,我有大小为4(8,16)的线程池

分配此工作负载的最佳策略是什么?我能想到两件事:

  • 对于executor服务,每个对象=1个任务。这似乎是最糟糕的决定,即使与在一个线程中处理所有内容相比也是如此
  • 将对象的总数除以工人数。例如,如果有4名工人,每人将获得25万件物品进行处理。这是非常简单的,在我看来,可以有一些其他的选择

  • 请分享您的想法和其他方法(可能使用FJP会更有效)

    您考虑过一些特殊情况:1个任务包含1个对象,1个任务包含25000个对象。很可能,最佳批量大小介于两者之间。尝试这些配置并记下花费的时间。还可以尝试8、64、500、4k和32k对象。然后看看最好的时间。例如,如果最佳时间是500,那么也可以尝试125、250、1k和2k,依此类推。这类似于二进制搜索,但采用对数比例。

    从一个“工作”池开始,每个工作依次要求处理一段数据(从队列中),当处理完每一段数据时,可以将其放入“已完成”列表中排队,然后该过程重复,直到队列中没有更多的块queue@MadProgrammer如果数据在处理需求方面相当同质(正如OP所暗示的),那么最好避免共享队列的额外同步。工作负载是分布在一台机器上还是分布在多台主机上?如果您只有一台主机,您可以简单地使用
    ExecutorService
    ,其工作线程数等于处理器的核心计数。