정확하게 이해했다면, 조건 외의 take
방법을 요청 했습니까? 글쎄, 그 어렵지 않다 :
while (!links.isEmpty()) {
try {
String link = links.take();
// Do stuff.
} catch (InterruptedException e) {
// Exception handling.
}
}
현재 상태 !(link = links.take()).isEmpty()
검사 반환 값이-A가 아닌 큐 (길이가 0 일) 빈 문자열-경우.
어쨌든 위의 코드는 atomic이 아니므로 links.isEmpty()
과 links.take()
사이에 아무 것도 발생하지 않는다고 보장 할 수 없습니다.
편집 :
BlockingQueue<Integer> numbers = new ArrayBlockingQueue<>(10);
AtomicBoolean flag = new AtomicBoolean(true);
// Producer.
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
numbers.put(i);
} catch (InterruptedException e) { /* NOP */ }
}
flag.set(false);
}).start();
// Consumer.
while (flag.get() || !numbers.isEmpty()) {
try {
System.out.println(numbers.take());
} catch (InterruptedException e) { /* NOP */ }
}
AtomicBoolean
여기에 필요하지 않지만 여러 제작자 및/또는 소비자가 있다면 그것은 편리한 될 수 있습니다 당신은 플래그와 함께 시작하는 동안 race conditions를 처리 할 수 있습니다. 또한 체크 아웃해야하는 java.util.concurrent
의 일부입니다.
하지만 별도의 질문이지만 생산자 코드 내에서 일정 수의 요소가 소비자에 의해 처리 된 후 생산 중단 시점을 알 수 있습니까? – davidchoo12
이 작업은 비동기 적으로 수행 할 수 있습니다. 'n' 아이템을 소비하길 원한다면,'n'의 용량을 가진'ArrayBlockingQueue'를 생성 할 수 있습니다. 대기열에 충분한 공간이 없으면'put'만이 차단되어 제작자가 발사하고 잊을 수 있습니다. – beatngu13
하지만 소비자가 '테이크'를하면 공간이 생기고 생산자는 대기열에 계속 들어가기 때문에 생산자가 일시 중지되지만 소비자가 여러 항목을 처리하면 완전히 중단됩니다. – davidchoo12