Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/323.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_Arraylist - Fatal编程技术网

线程来处理Java中的大型对象列表

线程来处理Java中的大型对象列表,java,multithreading,arraylist,Java,Multithreading,Arraylist,我有一个非常大的ArrayList对象,它在一个线程中顺利执行。但执行时间是关键因素 让我的列表有50个元素,我有3个线程 我想第一个线程将处理0到15,第二个线程将处理16到31,其余的进程将由第三个线程处理 有可能吗?从技术上讲,这样做是可能的,但这不是一个好主意: 任何固定分区都有工作线程工作负载不平衡的风险。完成计算的并行部分所用的时间是每个辅助线程的最大时间 ArrayList可能成为争用瓶颈,特别是当线程需要更新它时 更好的方法是使用排队机制,让所有工人都从同一个队列中完成工作。

我有一个非常大的
ArrayList
对象,它在一个线程中顺利执行。但执行时间是关键因素

让我的列表有50个元素,我有3个线程

我想第一个线程将处理0到15,第二个线程将处理16到31,其余的进程将由第三个线程处理


有可能吗?

从技术上讲,这样做是可能的,但这不是一个好主意:

  • 任何固定分区都有工作线程工作负载不平衡的风险。完成计算的并行部分所用的时间是每个辅助线程的最大时间

  • ArrayList
    可能成为争用瓶颈,特别是当线程需要更新它时


更好的方法是使用排队机制,让所有工人都从同一个队列中完成工作。实现这一点的一个简单方法是使用
ExecutorService
和一个有界工作池。(fork-join框架是另一种可能性,尽管它更适合于任务之间存在依赖关系的动态或递归任务。)

从技术上讲,可以这样做,但这不是一个好主意:

  • 任何固定分区都有工作线程工作负载不平衡的风险。完成计算的并行部分所用的时间是每个辅助线程的最大时间

  • ArrayList
    可能成为争用瓶颈,特别是当线程需要更新它时


更好的方法是使用排队机制,让所有工人都从同一个队列中完成工作。实现这一点的一个简单方法是使用
ExecutorService
和一个有界工作池。(fork-join框架是另一种可能性,尽管它更适合于任务之间存在依赖关系的动态或递归任务。)

对于您的情况,最佳选择是使用一个线程从excel文件读取URL,并将其放入容量有限的ArrayBlockingQueue中。启动几个工作线程,一个接一个地获取URL并刮取引用的站点。标准线程池不会有帮助,因为在访问站点时,每个工作都需要阻塞,而线程池不喜欢它们的线程被阻塞。唯一需要调整的参数是工作线程的数量。尝试10、100、1000、10000以找出最快的配置。如果数千个线程的内存耗尽,但未达到最佳值,则切换到某些NIO库,如Netty。

对于您的情况,最佳方法是使用一个线程从excel文件读取URL,并将其放入容量有限的ArrayBlockingQueue中。启动几个工作线程,一个接一个地获取URL并刮取引用的站点。标准线程池不会有帮助,因为在访问站点时,每个工作都需要阻塞,而线程池不喜欢它们的线程被阻塞。唯一需要调整的参数是工作线程的数量。尝试10、100、1000、10000以找出最快的配置。如果数千个线程的内存耗尽,但未达到最佳值,则切换到某些NIO库,如Netty。

“可能吗?”是。但就我个人而言,我会使用某种服务,也许是一种服务。这样,执行者可以根据列表中项目的可用性来处理列表…例如…@PulkitSethi:为什么?根据所做的工作(我们没有被告知),速度可能会快三倍。当然,它也可以慢一些。。。完全取决于工作负载类型和可用资源(CPU、IO、内存等)。@PulkitSethi-有时。有时候不是。这真的取决于处理过程是什么。和您的资源。@PulkitSethi即使没有多核,也不一定是真的。例如,如果“处理”占用了大部分等待IO的时间,那么如果在一个CPU核上有多个线程,处理速度会更快。@PulkitSethi-大多数现代PC都是多核的。现在单核系统是个例外。“可能吗?”是的。但就我个人而言,我会使用某种服务,也许是一种服务。这样,执行者可以根据列表中项目的可用性来处理列表…例如…@PulkitSethi:为什么?根据所做的工作(我们没有被告知),速度可能会快三倍。当然,它也可以慢一些。。。完全取决于工作负载类型和可用资源(CPU、IO、内存等)。@PulkitSethi-有时。有时候不是。这真的取决于处理过程是什么。和您的资源。@PulkitSethi即使没有多核,也不一定是真的。例如,如果“处理”占用了大部分等待IO的时间,那么如果在一个CPU核上有多个线程,处理速度会更快。@PulkitSethi-大多数现代PC都是多核的。现在单核系统是个例外。让我澄清一下细节,我从excel中读取了数千个url,并将其保存在arraylist中,然后我将从某个站点中获取每个url。我使用Arraylist,这样我就可以根据索引超过任何元素。让我澄清细节,我从excel中读取数千个url,并将其保存在Arraylist中,然后我将从某个站点中获取每个url。我使用Arraylist,这样就可以根据索引超出任何元素。