문제

이 질문의 제목은 이것이 존재하는지 의심하지만 여전히 :

Java의 구현이 있는지 여부에 관심이 있습니다. 차단식, 그것은 크기로 경계를 이루고, 차단하지 않으며, 너무 많은 요소를 큐를 타려고 할 때 예외를 던집니다.

편집하다 - Blockingqueue를 실행자에게 전달합니다. 하나는 다른 차단식을 감싸는 블록 킹크를 쓸 수 있으며 add ()에게 전화를 걸어 ()에게 전화를 걸 수 있습니다 ().

도움이 되었습니까?

해결책

편집하다: 당신의 새로운 설명을 바탕으로 나는 당신이 잘못된 질문을하고 있다고 생각합니다. 집행자를 사용하는 경우 사용자 정의를 정의해야합니다. 거부 예방 적 핸들러 대기열을 수정하는 대신. 이것은 ThreadPooleExecutor를 사용하는 경우에만 작동하지만, 그렇지 않은 경우 큐가 아닌 집행자를 수정하는 것이 더 나은 아이디어 일 것입니다.

제안을 무시하고 ADD처럼 행동하게 만드는 것은 실수라고 생각합니다. 인터페이스 방법은 계약을 구성합니다. 차단 큐를 사용하는 클라이언트 코드는 실제로 문서가 지정한 작업을 수행하는 방법에 따라 다릅니다. 그 규칙을 어기는 것은 상처의 세계를 위해 열립니다. 그건, 그것은 부적절하다.


그만큼 추가하다() Blockingqueues에 대한 방법은 그렇게하지만 권하다() 일반적으로 더 나은 선택 인 방법. 제안 ()에 대한 문서에서 :

큐의 용량을 초과하지 않고 즉시 그렇게 할 수있는 경우이 대기열의 꼬리에 지정된 요소를 삽입하여 성공시 True를 반환 하고이 대기열이 가득 차면 False를 반환합니다. 이 방법은 일반적으로 메소드 add (e)보다 선호되며,이 방법은 예외를 던져서만 요소를 삽입하지 못할 수 있습니다.

이것은 특정 구현 (ArrayBlockingqueue, LinkedBlockingqueue 등)에 관계없이 이러한 모든 대기열에 대해 작동합니다.

BlockingQueue<String> q = new LinkedBlockingQueue<String>(2);
System.out.println(q.offer("foo")); // true
System.out.println(q.offer("bar")); // true
System.out.println(q.offer("baz")); // false

다른 팁

하나는 다른 차단식을 감싸는 블록 킹크를 쓸 수 있으며 add ()에게 전화를 걸어 ()에게 전화를 걸 수 있습니다 ().

그것이 질문이된다면 ... 대답은 "예"이지만 add ()를 무시하는 서브 클래스를 만들어 더 깔끔하게 할 수 있습니다. 유일한 캐치 (두 경우 모두)는 귀하의 버전이 add 재정의하는 메소드에없는 점검 된 예외를 던질 수 없으므로 "블록 블록"예외는 선택되지 않아야합니다.

이것은 슬프고, 차단할 수없고, 차단하고 싶은 많은 사용 사례가 너무 많아서, 자신의 경계 차단 대기열을 집행자에게 제공한다는 모든 아이디어는 의미가 없습니다.

public void execute(Runnable command) {
        if (command == null)
            throw new NullPointerException();
        if (poolSize >= corePoolSize || !addIfUnderCorePoolSize(command)) {
            if (runState == RUNNING && workQueue.***offer***(command)) {
                if (runState != RUNNING || poolSize == 0)
                    ensureQueuedTaskHandled(command);
            }
            else if (!addIfUnderMaximumPoolSize(command))
                reject(command); // is shutdown or saturated
        }
    }

Batch (Executor)의 소스 DB에서 쿼리를 실행하고 배치가 풍부하고 다른 DB (Executor)에 쿼리를 실행하는 간단한 사용 사례는 다른 DB에 넣는 것처럼 빠르게 쿼리를 실행하려고합니다. 이 경우 Dest Executor는 블로킹 경계 집행자를 수락하여 여론 조사를 유지하고 더 많은 쿼리를 실행하기 위해 완료된 수를 확인하는 것보다 문제를 해결해야합니다.

더, 나머지 의견을 참조하십시오 :

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top