생산자 소비자 문제 [라인 중 ConcurrentLinkedQueue]

프로젝트 수요: 최상 위 네트워크 에서 요청 한 곳 에서 프로젝트 의 모든 네트워크 요청 의 이상 [생산] 을 포착 한 후 요청 한 잘못된 로 그 를 서버 [소비] 에 보고 해 야 합 니 다.
      사고: 스 레 드 가 필요 합 니 다. 네트워크 요청 에 이상 한 메시지 가 있 는 지 계속 스 캔 해 야 합 니 다. > 내 가 있 으 면 실행 합 니 다. 기다 리 지 않 았 습 니 다. - "많은 네트워크 요청 이 이상 하 게 FIFO 대기 열 에 저장 되 었 습 니 다." 밖 에 스 레 드 를 열 면 캡 처 된 이상 충 대기 열 에서 꺼 냅 니 다. "서버 에 오류 로 그 를 보 냅 니 다.
이러한 데이터 구조 에 따라 JDK 의 java. util. concurrent 패키지 아래 의 ConcurrentListQueue 클래스 를 찾 았 습 니 다.
이 가방 의 역할 은 자바 util. concurrent: 많은 스 레 드 안전, 테스트 양호, 고성능 의 병행 구축 블록 을 포함 합 니 다.천만에요. java. util. concurrent 를 만 드 는 목적 은 Collection 프레임 워 크 가 데이터 구조 에 대한 병행 작업 을 실현 하 는 것 입 니 다.신뢰성 있 고 고성능 의 동시 구축 블록 을 제공 함으로써 개발 자 는 동시 다발 류 의 스 레 드 안전, 신축성, 성능, 가 독성 과 신뢰성 을 향상 시 킬 수 있다.
보충 지식: 병행 과 병발 의 차이
1. 병행 이란 두 사람 이 동시에 한 가지 일 을 집행 하 는 것 을 말한다. 예 를 들 어 경 주 를 하면 두 사람 이 끊임없이 앞으로 달 리 는 것 을 말한다.2. 병발 이란 자원 이 유한 한 상황 에서 이들 이 번갈아 자원 을 사용 하 는 것 을 말한다. 예 를 들 어 한 구간 의 길 (단일 핵 CPU 자원) 은 한 사람 만 지나 갈 수 있 고 A 가 한 구간 간 후에 B 에 게 양보 하고 B 가 다 쓴 후에 A 에 게 계속 준다. ,교체 사용 의 목적 은 효율 을 높이 는 것 이다 
    ConcurrentLinkedQueue:  FIFO         。
  
  
         ,   :offer   poll  。

 
  
private static ConcurrentLinkedQueue<AddLogToService> queue = new ConcurrentLinkedQueue<AddLogToService>();

생산의 실현: queue 의 offer 방법 을 호출 하여 queue 에 메 시 지 를 계속 추가 합 니 다.
  /**
     *   
     */
    public static void offer(AddLogToService ats) {
        queue.offer(ats);
    }

소비 논리: 스 레 드 를 켜 고 대기 열 [queue] 에서 [poll] 메 시 지 를 계속 가 져 옵 니 다. 메시지 가 있 으 면 업무 논 리 를 실행 하고 없 으 면 1 초 동안 잠 을 자 십시오.
/**
     *   
     * @author wfc
     */
    class Poll implements Runnable {
        public void run() {
            // while (queue.size()>0) {
            while (true) {
                AddLogToService als = queue.poll();
                if (als == null) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                } else {
                    postException(Constant.URL_ADD_SERVICELOG, als);
                }
            }
        }
    }

그렇다면 어떻게 달 릴 수 있 을 까? 네트워크 요청 이 잘못 되면 직접 offer 방법 을 호출 하여 계속 생산 하면 된다.

좋은 웹페이지 즐겨찾기