Blockingqueue가 가득 차면, 물건을 저장하려는 시도는 차단되며 Blockingqueue에 새로운 공간이있을 때까지 작업을 계속하기 위해 깨어나지 않습니다.
Blockingqueue가 제공하는 주요 방법은 다음과 같습니다.
추가 (anobject) : blockingqueue에 anobject를 추가하십시오.
제안 (anobject) : blockingqueue에 anobject를 추가하면 true를 반환하십시오.
put (anobject) : blockingqueue에 anobject를 추가하십시오.이 방법을 호출하는 스레드는 계속되기 전에 블록 킹크에 새로운 공간이있을 때까지 차단됩니다.
설문 조사 (Time) : Blockingqueue에서 먼저 순위를 매기는 경우 시간 매개 변수로 지정된 시간을 기다릴 수 있습니다. 검색 할 수 없을 때 null을 반환합니다.
가져 오십시오 () : Blockingqueue에서 먼저 순위가 매겨지면 Blockingqueue의 새 개체가 추가 될 때까지 대기 상태를 차단하십시오.
다른 요구에 따라 4 개의 구체적인 구현이 있습니다.
(1) ArrayBlockingqueue : 지정된 크기의 생성자는 크기를 나타내는 int 매개 변수가 있어야합니다. 포함 된 개체는 FIFO (First-in, First-At) 순서로 정렬됩니다.
(2) LinkedBlockingqueue : 생성자가 지정된 크기의 매개 변수를 사용하는 경우 생성 된 블록 링크는 크기 제한을 갖습니다.
크기 매개 변수가 포함되지 않으면 생성 된 블록 링크의 크기는 integer.max_value에 의해 결정됩니다. 포함 된 개체는 FIFO (First-in, First-At) 순서로 정렬됩니다.
LinkedBlockingqueue 및 ArrayBlockingqueue와 비교하여 그 뒤에 사용 된 데이터 구조는 다릅니다.
LinkedBlockingqueue의 데이터 처리량은 ArrayBlockingQueue의 데이터 처리량보다 크지 만 실적 예측 가능성은 스레드 수가 많을 때 ArrayBlockingQueue의 성능 예측보다 낮습니다.
(3) PriorityBlockingqueue : LinkedBlockingqueue와 유사하지만 포함하는 물체의 정렬은 FIFO가 아니지만 물체의 자연 분류 순서 또는 생성자가 가져온 비교기에 의해 결정된 순서에 의해 결정됩니다.
(4) 동기식 : 특수 차단식, 그 작동은 퍼팅 및 페치를 통해 교대로 완료해야합니다.
코드 사본은 다음과 같습니다.
패키지 com.yao;
java.util.concurrent.arrayblockingqueue import;
java.util.concurrent.blockingqueue 가져 오기;
import java.util.concurrent.executorservice;
java.util.concurrent.executors import;
공개 클래스 BlockingqueUetest {
/**
애플의 바구니 정의
*/
공개 정적 클래스 바구니 {
// 바구니, 사과 3 개를 담을 수 있습니다
Blockingqueue <string> 바스켓 = 새로운 ArrayBlockingqueue <string> (3);
// 사과를 생산하고 바구니에 넣습니다
Public Void Produce ()가 중단 된 소식을 던지려면 {
// 배터리가 가득 차면 애플을 배터리에 위치시킬 때까지 기다립니다.
Basket.put ( "Apple");
}
// 사과를 섭취하여 바구니에서 꺼냅니다.
public string cofume () throws InterruptedException {
// 배터리가 비어 있으면 사과를 꺼내십시오.
문자열 apple = basket.take ();
애플을 반환;
}
public int getapplenumber () {
Return Basket.Size ();
}
}
// 테스트 방법
public static void testbasket () {
// 사과로 바구니를 만듭니다
최종 바구니 바스켓 = 새로운 바스켓 ();
// Apple Producer 정의
클래스 프로듀서는 실행 가능한 {
public void run () {
노력하다 {
while (true) {
// 애플을 생산합니다
System.out.println ( "프로듀서는 사과를 생산할 준비가되었습니다."
+ System.CurrentTimeMillis ());
basket.proctor ();
System.out.println ( "프로듀서는 사과 생산을 마쳤습니다."
+ System.CurrentTimeMillis ());
System.out.println ( "제작 후에는 사과가 있습니다 :"+basket.getApplenumber ()+");
// 300ms 수면
Thread.sleep (300);
}
} catch (InterruptedException ex) {
}
}
}
// Apple 소비자를 정의합니다
클래스 소비자는 실행 가능한 {
public void run () {
노력하다 {
while (true) {
// 애플 소비
System.out.println ( "소비자는 Apple을 소비 할 준비가되었습니다 :"
+ System.CurrentTimeMillis ());
basket.consume ();
System.out.println ( "소비자 소비 애플"
+ System.CurrentTimeMillis ());
System.out.println ( "소비 후, 사과가 있습니다 :"+basket.getApplenumber ()+");
// 1000ms 수면
Thread.sleep (1000);
}
} catch (InterruptedException ex) {
}
}
}
ExecutorService Service = Executor.NewCachedThreadPool ();
생산자 프로듀서 = 새로운 생산자 ();
소비자 소비자 = 새로운 소비자 ();
Service.Submit (프로듀서);
Service.Submit (소비자);
// 프로그램이 10 초 동안 실행되면 모든 작업이 중지됩니다.
노력하다 {
Thread.sleep (10000);
} catch (InterruptedException e) {
}
service.shutdownnow ();
}
public static void main (String [] args) {
blockingqueuetest.testbasket ();
}
}