【问题标题】:Thread to handle Large List of objects in Java [closed]在Java中处理大量对象的线程[关闭]
【发布时间】:2013-08-28 02:04:28
【问题描述】:

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

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

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

有可能吗?

【问题讨论】:

  • “有可能吗?”是的。不过就个人而言,我会使用某种Exectuor 服务,也许是fixed thread pool。这样,执行者可以根据列表中项目的可用性来处理列表......例如......
  • @PulkitSethi:为什么?根据正在完成的工作(我们没有被告知),它可能会快三倍。当然,它也可能更慢......完全取决于工作负载的类型和可用资源(CPU、IO、内存等)。
  • @PulkitSethi - 有时。有时不是。这真的取决于处理是什么。还有你的资源。
  • @PulkitSethi 即使没有多核也不一定是真的。例如,如果“处理”大部分时间都在等待 IO,那么如果您在 1 个 CPU 内核上有多个线程,它仍然会更快。
  • @PulkitSethi - 大多数现代 PC 都是多核的。如今,单核系统是个例外。

标签: java multithreading arraylist


【解决方案1】:

这在技术上是可行的,但这不是一个好主意:

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

  • ArrayList 可能成为争用瓶颈,尤其是在线程需要更新它时。

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

【讨论】:

  • 让我清除细节,我从 excel 中读取了数千个 url 并将其保存在 arraylist 中,然后我要从某个站点抓取每个 url。我使用 Arraylist 以便可以根据索引超出任何元素。
【解决方案2】:

对于您的情况,最佳方案是使用一个线程从 excel 文件中读取 url,并将其放入容量有限的 ArrayBlockingQueue 中。启动几个工作线程,它们一个一个地获取 url 并抓取引用的站点。标准线程池无济于事,因为每个工作在访问站点时都需要阻塞,而线程池不喜欢它们的线程被阻塞。唯一需要调整的参数是工作线程的数量。尝试 10、100、1000、10000 以找出最快的配置。如果有几千个线程,内存已经耗尽,但没有达到最优,那么切换到像Netty这样的NIO库。

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多