我有一个非常大的ArrayList
对象,它在一个线程中顺利执行。但执行时间是因素。
让我的列表有50个元素,我有3个帖子,
我希望第一个线程将处理0到15,第二个线程将处理16到31,其余的进程将由第三个线程处理。
有可能吗?
答案 0 :(得分:3)
技术上可以做到这一点,但这不是一个好主意:
任何固定分区都存在工作线程工作负载不平衡的风险。完成计算的并行部分所花费的时间是每个工作线程的最大次数。
ArrayList
可能成为争用瓶颈,尤其是在线程需要更新时。
更好的方法是使用排队机制,所有工作人员都从同一队列中工作。实现此目的的一种简单方法是使用带有限工作池的ExecutorService
。 (fork-join框架是另一种可能性,但它更适合于任务之间存在依赖关系的动态或递归任务。)
答案 1 :(得分:0)
对于您的情况,最佳方法是使用excel文件中的一个线程读取URL并将其放入容量有限的ArrayBlockingQueue中。启动几个工作线程,逐个获取URL并刮取引用的站点。标准线程池无济于事,因为每个工作在访问站点时都需要阻塞,而线程池在阻塞线程时不喜欢。需要调整的唯一参数是工作线程的数量。尝试10,100,1000,10000找出最快的配置。如果对于数千个线程,内存耗尽但未达到最佳状态,则切换到某些NIO库,如Netty。