java 7中的递归反应

java 7中的递归反应,java,multithreading,Java,Multithreading,我正在检查数十亿条包含大量URL的记录。所以我想检查每个url是否有效。然后,在搜索特定url时,它会显示在我的应用程序中。因此,运行一个用于递归检查URL的作业。现在我使用递归反应来解决这个问题。这条路对吗?。请给我一些有价值的建议 请查找下面的代码 public class JobsRecurssiveAction extends RecursiveAction { /** * */ private static final long serialVersionUID =

我正在检查数十亿条包含大量URL的记录。所以我想检查每个url是否有效。然后,在搜索特定url时,它会显示在我的应用程序中。因此,运行一个用于递归检查URL的作业。现在我使用递归反应来解决这个问题。这条路对吗?。请给我一些有价值的建议

请查找下面的代码

      public class JobsRecurssiveAction extends RecursiveAction {

/**
 * 
 */
private static final long serialVersionUID = 1L;


private final String[] domainsList;
private final Integer low;
private final Integer high;

private static final int THRESHOLD = 5000;

public JobsRecurssiveAction(String[] domainsList, int low, int high) {
   super();
   this.domainsList = domainsList;
   this.low = low;
    this.high= high;
}
@Override
protected void compute() {
    if (high - low < THRESHOLD) {
        ObjectMapper mapper = null;
          for (int i = low; i < high; ++i){
           mapper = new ObjectMapper();
            DomainList domainList = null;
         try {
             domainList =   mapper.readValue(cassandraService.getRedisValue(domainsList[i]), DomainList.class);
             cassandraService.deleteKey(domainsList[i]);
             int totalResources = domainList.getResourceCount();
             int totalCheckedResources = domainList.getTotalChecked();
             if(totalResources == totalCheckedResources){
                 cassandraService.resetDomainList(domainList);
             }
             cassandraService.stautsCheckerUrl(domainList);
             logger.info("domainList Domain :{} :: resourceCount:{}",domainList.getDomainName(),domainList.getResourceCount());
        } catch (Exception ex ) {
            ex.printStackTrace();
        } 
       }
    } else {
       int mid = (low + high) >>> 1;
       invokeAll(new JobsRecurssiveAction(domainsList, low, mid), new JobsRecurssiveAction(domainsList, mid, high));
  }
}


}
公共类作业递归动作扩展递归动作{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
私有最终字符串[]域列表;
私有最终整数低;
私人最终整数高;
私有静态最终整数阈值=5000;
public JobsRecursiveAction(字符串[]域列表,整数低位,整数高位){
超级();
this.domainsList=domainsList;
这个.低=低;
这个。高=高;
}
@凌驾
受保护的void compute(){
if(高-低<阈值){
ObjectMapper映射器=null;
对于(int i=低;i<高;++i){
映射器=新的ObjectMapper();
DomainList DomainList=null;
试一试{
domainList=mapper.readValue(cassandraService.getRedisValue(domainsList[i]),domainList.class);
deleteKey(域名列表[i]);
int totalResources=domainList.getResourceCount();
int totalCheckedResources=domainList.getTotalChecked();
if(totalResources==totalCheckedResources){
cassandraService.resetDomainList(domainList);
}
cassandraService.statscheckerurl(域名列表);
info(“domainList域:{}::resourceCount:{}”,domainList.getDomainName(),domainList.getResourceCount());
}捕获(例外情况除外){
例如printStackTrace();
} 
}
}否则{
int mid=(低+高)>>>1;
调用所有(新作业递归动作(domainsList,low,mid),新作业递归动作(domainsList,mid,high));
}
}
}

您可以使用Fork/Join框架,它将帮助您实现递归方法。它设计用于可以递归地分解为多个任务的任务

检查:-


如果没有更多信息,我就说不出如何帮助。一些代码可能会有所帮助。invokeAll()向框架提交新请求。您需要做的是使用fork()对当前请求进行分段。遵循JavadocforForkJoinPool中的示例。例如左、右分割。left.fork()right.join()。我正在计算方法中添加这些行。正确吗?整数中间值=(低+高)>>>1;JobsRecursiveAction left=新JobsRecursiveAction(域列表、低、中、resourceCassandraService);JobsRecursiveAction right=新的JobsRecursiveAction(域列表、中等、高、resourceCassandraService);调用全部(左、右);对现在做左。fork();对。compute();左。join();请按照下面的例子来做。非常感谢你。。。无需添加invokeAll(左、右)???