다 중 스 레 드 상황 에서 파충류 가 기어 오 른 결과 에 대한 예

12658 단어 JAVA
요 며칠 동안 자바 로 파충류 작업 을 해 왔 습 니 다. 전에 만난 것 은 모두 비교적 간단 합 니 다. 대부분 단일 인터페이스 에서 기어 올 랐 습 니 다. 이번 에는 파충류 100 여 개의 인터페이스 가 필요 합 니 다. 몇 개의 스 레 드 를 더 뛰 어야 합 니 다.
그러나 이러한 인터페이스 는 정보 에 중복 되 기 때문에 leader 는 우리 에 게 반드시 다시 해 야 한다 고 요구한다. 왜냐하면 데이터 베 이 스 를 변경 하 는 것 은 횟수 제한 이 있 기 때문이다.그래서 며칠 을 만 들 고 나 서 야 이 프로그램 을 썼 다.
먼저 생각 을 쓰 세 요. 우선, JAVA 가 가지 고 있 는 스 레 드 안전 한 집합 을 이용 하여 Concurrent HashMap 은 자동 으로 무 거 운 작업 을 합 니 다.그러나 다 중 스 레 드 상황 에서 스 레 드 동기 화 에 주의해 야 합 니 다. 집합 류 의 스 레 드 안전 은 저장 할 때 만 잠 겨 있 습 니 다. 이것 은 우리 가 조건 판단 을 할 때 도 스 레 드 가 안전 하 다 는 것 을 의미 하지 않 습 니 다. 이것 은 우리 가 동기 화 되 어야 할 코드 블록 에 자 물 쇠 를 채 워 야 합 니 다.
public static ConcurrentHashMap,Integer>  hashMap=new ConcurrentHashMap, Integer>();

AtomicInteger integer = new AtomicInteger();
public void process(Page page)
{

    if(page.getUrl().toString()=="https://www.toryburch.com/stores-viewal")
    

    {
        for (String a : url) {

            page.addTargetRequest(a);
        }
    }

    else
    {

        String shopId = "";
        String branchName = "";
        StringBuffer address = new StringBuffer();
        String crawlUrl = "";
        String region = "";
        String city = "";
        String country = "the United States";
        String shopName = "LanCome";
        String sourceName = "LanCome";
        String phone = "";
        String openTime = "";
        double lat = 0.0;
        double lng = 0.0;


        List infoList=page.getHtml().xpath("poi").nodes();
        List brandPoiDtos =new ArrayList();
        //             ,
        if(infoList.size()>=1)
        {
            for(Selectable b:infoList)
            {
                phone=b.xpath("//phone/text()").toString();
                shopId=b.xpath("//uid/text()").toString();
                city=b.xpath("//city/text()").toString();
                branchName=b.xpath("//name/text()").toString();
                lat=Double.parseDouble(b.xpath("//latitude/text()").toString());
                lng=Double.parseDouble(b.xpath("//longitude/text()").toString());

                //    :  address1 address2
                address=address.append(b.xpath("//address1/text()").toString()).append(b.xpath("//address2/text()").toString());


                BrandPoiDto dto = new BrandPoiDto();

                dto.setBranchName(branchName);
                dto.setAddress(address.toString());
                dto.setCrawlUrl(page.getUrl().toString());
                dto.setCity(city);
                dto.setCountry(country);
                dto.setPhone(phone);
                dto.setLat(lat);
                dto.setLng(lng);
                dto.setShopName(shopName);
                dto.setSourceName(sourceName);
                dto.setShopId(shopId);




                synchronized (this)
                {
                    if(hashMap.get(shopId)==null)
                    {
                        hashMap.put(shopId,1);
                        brandPoiDtos.add(dto);

                        System.out.println(dto);
                        integer.incrementAndGet();

                    }

                }

                //       
                address.delete(0,address.length());
                phone="";
                lat=0.0;
                lng=0.0;
                shopId="";
                branchName="";
                city="";


            }
        }
        //       
        System.out.println("       "+integer);

    }

코드 는 다음 과 같 습 니 다. 저 는 synchronized 동기 화 된 코드 블록 을 사용 하여 hashMap 에 이 정보 가 있 는 지 판단 합 니 다 (key 는 업 체 uid 이 고 유일한 것 입 니 다). 없 으 면 데 이 터 를 저장 하고 플래그 비트 1 을 설정 합 니 다. 있 으 면 저장 과 인쇄 검증 을 하지 않 습 니 다.동기 화 코드 블록 과 hashmap 를 통 해 여러 스 레 드 로 캡 처 할 때 중복 되 는 데 이 터 를 제거 하 는 문 제 를 해결 하 였 습 니 다.
               







좋은 웹페이지 즐겨찾기