# 코드 :
공용 클래스 애플리케이션 { 공공 정적 무효 메인 (문자열 []에 args) { BlockingQueue의 <정수> = 큐 새로운 ArrayBlockingQueue를 <> (6 ); 프로듀서 프로듀서 = 새로운 프로듀서 (큐); 소비자 소비자 = 새로운 소비자 (큐); producer.produce ( 5 ); consumer.consume ( 4 ); producer.produce ( 3 ); consumer.consume ( 2 ); } } 클래스 프로듀서 { 개인BlockingQueue의 <정수> 큐; 공개 생산자 (BlockingQueue의 <정수> 큐) { 이 .queue = 큐; } 공공 무효의 생산 ( 최종 INT의 발은) { 새로운 스레드 () { 공공 무효 실행 () { 시도 { INT의 잉여 = 발을; 반면 (잉여> 0 ) { queue.put ( 1024 ); 흑자 - ; System.out.printf ( "(%의 D) 생성 실제로 %의 D), 큐 크기 (%의 D) \ n (생산할 %의 계획" , 는 Thread.currentThread (). getName (), 발, 1 , 큐. 크기()); } } 캐치 (예외 : InterruptedException 전자) { e.printStackTrace (); } } } .start (); } } 클래스 소비자 { 개인 의 BlockingQueue <정수> 큐; 공용 사용자 (BlockingQueue의 <정수> 큐) { 이 .queue = 큐; } 공공 무효가 소비 ( 최종 INT의 발) { 새로운 스레드 () { 공공 무효 실행 () { INT의 잉여 = 발; 시도 { 동안 (잉여> 0 ) { queue.take (); 흑자 - ; System.out.printf는 ( "%의 계획은 실제로 %의 D), 큐 크기 (%의 D) \ n (소비) %의 D (소비" , 는 Thread.currentThread을 (). getName (), 발을, 1 , 큐. 크기()); } } 캐치 (예외 : InterruptedException 전자) { e.printStackTrace (); } } } .start (); } }
# 출력 :
스레드 0 계획 (5)는, 실제로는 (1), 큐 크기는 (1)을 제조 생산하는
스레드 3 플랜 소비 (2) 실제 (1), 큐 크기 (0) 소비하는
스레드 2 계획 생산 (3 ), 실제로는 (1) 생산 큐 사이즈 (1)
스레드 1 플랜 실제로 1, 큐 크기 (0) 소비 (4) 소비
스레드 -2- 계획 (3)은, 실제로 제조 생산 (1) 큐의 크기는 (1)
실 -3- 계획 (2) 실제 (1), 큐 크기 (0) 소비하는 소비
스레드 0 계획 생성하기 (5), 실제로 제조 (1), 큐 크기 (1)
실 -2- 계획 (3)은, 실제로 제조 생산 (1), 큐 크기 (1)
스레드 1 플랜 소비 (4), 실제로는 (1), 큐 크기 (0) 소비하는
스레드 0 계획 사실 (5)을 제조하는 제조 (1), 큐 크기 (2)
스레드 1 평면 (4)는, 실제로는 (1), 큐 크기 (1)을 소비하는 소비
스레드 1 평면 (4) 실제로 1, 큐 크기는 (1) 소비하는 소비
(스레드 0 계획 생산 5 ), 실제로는 (1), 큐 크기를 생성 (2)
의 스레드 0 평면 (5)은, 실제로 제조 (1), 큐 크기를 생성하는 단계 (2)
# 과정에 관여하는 네 개의 스레드, 두 프로듀서, 두 소비자가 있습니다