Java 동시 사용 노트(14)------- 대기열 차단

문서 목록
  • 차단 대기열
  • 1.약술
  • 2. Java의 차단 대기열
  • 2.1 Array BlockingQueue(FIFO, 유계)
  • 2.2 Linked BlockingQueue(FIFO, 유계)
  • 2.3 Priority BlockingQueue(우선 대기열)
  • 2.4 DelayQueue(무계)
  • 2.5 SynchronousQueue(FIFO)
  • 2.6 LinkedBlockingDeque
  • 3. 실현 원리
  • 대열을 막다
    1. 약술
    차단 큐(BlockingQueue)는 두 개의 추가 작업을 지원하는 큐입니다.이 두 가지 추가 작업은 막힌 삽입과 제거 방법을 지원합니다.막힌 대기열은 스레드 탱크와 함께 사용할 수 있습니다!
    왜 막힌 대열이라고 하죠?
  • 막힌 삽입과 삭제를 지원합니다.
  • 위에 쓸데없는 말이야!구체적으로 말하면 대기열이 가득 차거나 비어 있을 때 원소를 삽입/삭제하는 라인은 대기열 불만/비공식
  • 을 기다린다는 뜻이다.
    다음은 삽입 삭제의 네 가지 처리를 소개한다.
    처리 방식
    이상을 던지다
    특수값 반환
    막히다
    시간 초과 종료
    삽입
    add(e)
    offer(e)
    put(e)
    offer(e, time, unit)
    제거
    remove()
    poll()
    take()
    poll(time, unit)
    검사 방법
    element()
    peek()
    사용할 수 없음
    사용할 수 없음
  • 버퍼링 이상: 대기열에 원소를 삽입하면 버퍼링IllegalStateException("Queuefull") 이상이 발생합니다.대기열이 비어 있을 때, 대기열에서 원소를 가져오면 NoSuchElementException 이상이 발생합니다.
  • 반환 특수값: 반환boolean유형
  • 계속 막혀: 말 그대로 해석하지 마!
  • 시간 초과 종료: 0.0
  • 도 설명하지 않음
    2. Java의 차단 대기열
    2.1 Array BlockingQueue(FIFO, 경계 있음)
    이것은 유계수조이다.기본적으로 공정한 접근 대기열을 보장하지 않습니다.
    왜 공평한 방법을 쓰지 않는가!
    공평성을 확보하기 위해서는 통상적으로 물동량을 낮출 수 있다.
    2.2 Linked BlockingQueue(FIFO, 경계 있음)LinkedBlockingQueue는 체인 테이블로 이루어진 경계 막힘 대열이다.이 대기열의 기본 및 최대 길이는 Integer.MAX_VALUE입니다.
    2.3 Priority BlockingQueue(우선 순위)
    Priority BlockingQueue는 우선 순위를 지원하는 경계가 없는 차단 대기열입니다.사용자 정의 클래스 구현compareTo() 방법으로 원소 정렬 규칙을 지정하거나 구조 파라미터Comparator를 지정하여 원소를 정렬할 수 있습니다.
    주의해야 할 것은 같은 우선순위 요소의 순서를 보장할 수 없다는 것이다.
    2.4 DelayQueue(경계 없음)
    대기열 사용 PriorityQueue 을 사용합니다.대기열의 요소는 Delayed 인터페이스를 실현해야 합니다. 요소를 만들 때 대기열에서 현재 요소를 가져올 수 있는 시간을 지정할 수 있습니다.지연 기간이 만료된 경우에만 대기열에서 요소를 추출할 수 있습니다.
    장면 적용:
  • 캐시 시스템의 설계
  • 정시 임무 스케줄링
  • ScheduledThreadPoolExecutor와 함께 사용하여 정해진 시간에 작업을 수행할 수 있습니다
    2.5 SynchronousQueue(FIFO) SynchronousQueue는 요소를 저장하지 않는 막힌 대기열이다.모든put작업은take작업을 기다려야 합니다. 그렇지 않으면 원소를 계속 추가할 수 없습니다.기본적으로 라인은 비공평한 정책으로 대기열에 접근합니다.
    개인적 이해:
    이 막힌 대기열은Cached Thread Pool과 함께 사용하면 이 막힌 대기열을 배달원으로 볼 수 있습니다!주방의 요리를 소비자에게 보내다.처리량이 높다
    2.6 LinkedBlockingDeque LinkedBlockingDeque는 체인 테이블 구조로 구성된 양방향 막힘 대열이다.
    3. 실현 원리
    알림 모드를 사용하여 구현
    여기ArrayBlockingQueue를 예로 들면 클라이맥스가 온다!!!!위 소스:
    /** Condition for waiting takes */
    private final Condition notEmpty;
    
    /** Condition for waiting puts */
    private final Condition notFull;
    public ArrayBlockingQueue(int capacity, boolean fair) {
        if (capacity <= 0)
            throw new IllegalArgumentException();
        this.items = new Object[capacity];
        lock = new ReentrantLock(fair);
        notEmpty = lock.newCondition();
        notFull =  lock.newCondition();
    }
    

    위의 코드를 보면 생산 소비 양식과 두 개의 대기 행렬의 양식이 뚜렷하지 않습니까!
    추가, 삭제 작업에 대해 살펴보겠습니다.
    public void put(E e) throws InterruptedException {
        checkNotNull(e);
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == items.length)
                notFull.await();
            enqueue(e);
            //    isEmpty
        } finally {
            lock.unlock();
        }
    }
    
    public E take() throws InterruptedException {
        final ReentrantLock lock = this.lock;
        lock.lockInterruptibly();
        try {
            while (count == 0)
                notEmpty.await();
            return dequeue();
            //    notFull
        } finally {
            lock.unlock();
        }
    }
    

    좋은 웹페이지 즐겨찾기