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

Java 如何使用多线程使我的应用程序更快

Java 如何使用多线程使我的应用程序更快,java,multithreading,list,concurrency,hashset,Java,Multithreading,List,Concurrency,Hashset,我正在遍历一个包含+-1500个条目的字符串列表。在每次迭代中,我都会再次遍历字符串列表,但这次是+-3500万个条目。应用效果良好。但是应用程序需要很长时间(2个多小时)才能给出结果。我应该如何构造多线程以使我的应用程序更快 结果列表的顺序并不重要 我是否应该将大列表(3500万个条目)划分为较小的块,并并行遍历它们?(如何确定块的完美数量?) 我应该为小列表中的每个迭代启动一个线程吗?(这将创建1500个线程,我猜其中很多线程将“并行”运行) 我的其他选择是什么 守则的表述: List&

我正在遍历一个包含+-1500个条目的字符串列表。在每次迭代中,我都会再次遍历字符串列表,但这次是+-3500万个条目。应用效果良好。但是应用程序需要很长时间(2个多小时)才能给出结果。我应该如何构造多线程以使我的应用程序更快

结果列表的顺序并不重要

  • 我是否应该将大列表(3500万个条目)划分为较小的块,并并行遍历它们?(如何确定块的完美数量?)
  • 我应该为小列表中的每个迭代启动一个线程吗?(这将创建1500个线程,我猜其中很多线程将“并行”运行)
我的其他选择是什么

守则的表述:

List<String> result = new ArrayList<String>();
for(Iterator<String> i = data1.iterator();i.hasNext();){ //1500 entries
  String val = i.next();
  for(Iterator<String> j = data2.iterator();j.hasNext();){ //35 million entries
    String test = j.next();
    if(val.equals(test)){
      result.add(val);
      break;
    }
  }
}
for(Iterator<String> h = result.iterator();h.hasNext();){
  //write to file
}
List result=new ArrayList();
对于(迭代器i=data1.Iterator();i.hasNext();){//1500个条目
字符串val=i.next();
对于(迭代器j=data2.Iterator();j.hasNext();){//3500万个条目
字符串测试=j.next();
如果(值等于(测试)){
结果:添加(val);
打破
}
}
}
for(迭代器h=result.Iterator();h.hasNext();){
//写入文件
}
更新


在重新构造代码并实现JB Nizet给出的答案后,我的应用程序现在运行得更快了。现在只需要20秒就可以得到相同的结果!没有多线程

您可以使用并行流:

List<String> result = 
    data1.parallelStream()
         .filter(data2::contains)
         .collect(Collectors.toList());

您可以使用并行流:

List<String> result = 
    data1.parallelStream()
         .filter(data2::contains)
         .collect(Collectors.toList());

我也同意你的想法。你现在需要做什么

  • 首先计算系统中处理器的数量
  • 根据处理器的数量分割记录,并精确创建该数量的线程。(numberofprocessor*2最大值,否则由于线程之间的上下文切换,性能将降低)

  • 不要创建不必要的大量线程。这不会加快你的申请速度。根据系统中处理器的数量和内存的大小,精确检查应该创建多少线程。高效的并行处理也取决于您的机器硬件。

    我也同意您的想法。你现在需要做什么

  • 首先计算系统中处理器的数量
  • 根据处理器的数量分割记录,并精确创建该数量的线程。(numberofprocessor*2最大值,否则由于线程之间的上下文切换,性能将降低)


  • 不要创建不必要的大量线程。这不会加快你的申请速度。根据系统中处理器的数量和内存的大小,精确检查应该创建多少线程。高效的并行处理也取决于您的机器硬件。

    1500条记录的哈希集…因此循环为O(1)?使用比列表更有效的哈希集,如哈希集,然后只调用
    包含
    ,如何?如果启动1k5线程,则使用并行streamwell,除非您有1k5内核,他们中的很多人都在争夺资源,我认为速度不会像你想象的那么快。你的代码与你的描述不匹配。第二个数据来自哪里。每个val都一样吗?每个val的列表是否不同?1500条记录的哈希集…因此循环为O(1)?使用比列表性能更好的东西,比如哈希集,然后在其上调用
    contains
    ?使用并行streamwell,如果启动1k5线程,除非您有1k5内核,否则很多线程都会争夺资源,我认为它不会像你想象的那么快。你的代码与你的描述不匹配。第二个数据来自哪里。每个val都一样吗?每个val都是不同的列表吗?我想是将列表数据2转换为哈希集吗?好吧,我的答案是什么<代码>设置数据集2=新哈希集(数据2)。我假设只有当列表中的字符串和哈希集中的字符串是相同的对象时,这才有效?还是比较字符串的值?因为在这种情况下,data1和data2中的对象不相同(值从不同的csv文件中读取),当然不相同。HashSet.contains()和List.contains()都通过调用equals()来比较对象。如果两个字符串包含相同顺序的相同字符,则两个字符串相等。谢谢你的清楚解释。对你来说显而易见的东西并不是对每个人都显而易见;-)我想将列表数据2转换为哈希集?我的答案是什么<代码>设置数据集2=新哈希集(数据2)。我假设只有当列表中的字符串和哈希集中的字符串是相同的对象时,这才有效?还是比较字符串的值?因为在这种情况下,data1和data2中的对象不相同(值从不同的csv文件中读取),当然不相同。HashSet.contains()和List.contains()都通过调用equals()来比较对象。如果两个字符串包含相同顺序的相同字符,则两个字符串相等。谢谢你的清楚解释。对你来说显而易见的东西并不是对每个人都显而易见;-)