Java8并行流ParallelStream示例

最近对接一个接口需要把对面的产品以及产品详情都当过来,获取产品很好获取只要设置分页就能批量下载下来,但产品详情需要一个个的去访问,普通循环实在太慢所以

ParallelStream的使用是会有线程安全问题的
这个时候只要把需要遍历的list用Collections.synchronizedList(list);加上锁,
并且stream().parallel().forEach里面的参数都不能是共享的所以就除了加了锁的list其他的只能在里面new出来,,,,这样可能会因为并发消耗大量cpu资源,又可能因为new了大量对象消耗大量内存,但速度会快特别多实测stream().parallel().forEach比stream().forEach快四倍以上以下是例子:

嘿嘿怎么大的并发不是他扛不住,就是我扛不住
这只是个人经验,可能有所不足,或者很严重的缺陷欢迎指正

List<Product> synchronizedList = Collections.synchronizedList(list);
List<PftTicketInfo> pftTicketInfos = Collections.synchronizedList(new ArrayList<>());
synchronizedList.stream().parallel().forEach(n -> {
     
//这些实体类是为了生成xml
    GetTicketList getTicketList = new GetTicketList();
    GetTicketListBody getTicketListBody = new GetTicketListBody();
    GetTicketListRequestEntity getTicketListRequestEntity = new GetTicketListRequestEntity();
    getTicketList.setN(n.getUUid());
    getTicketListBody.setGetTicketList(getTicketList);
    getTicketListRequestEntity.setBody(getTicketListBody);
    try {
     
    //访问对面的产品详情接口
        String scenicSpotInfo = PFTHttpUtil.getHttpXml(JAXBXmlUtil.convertToXml(getTicketListRequestEntity));
        String orderPreCheckDataResultXml = PFTHttpUtil.getPftResultXml(scenicSpotInfo, httpConfig.getGetTicketListResponse(), httpConfig.getGetTicketList());
        //转换成对象
        List<PftTicketInfo> pftScenicInfos = JSONArray.parseArray(DomUtils.xmlToJson(orderPreCheckDataResultXml).getString(PFTConfig.REC), PftTicketInfo.class);
        if (CollectionUtils.isNotEmpty(pftScenicInfos)) {
     
        //加入到循环外面的list里面,好统一对数据库操作
            pftTicketInfos.addAll(pftScenicInfos);
        }
    } catch (Exception e) {
     
        e.printStackTrace();
    }
});

你可能感兴趣的:(java,java,stream,lambda,接口)