생산자 및 소비자 모델을 구현하는 몇 가지 방법
우리 삶의 모범을 예로 들어보십시오. 공장에서 생산 된 제품은 항상 외부에서 사용하도록 수출됩니다. 이것이 생산 및 소비의 개념입니다.
실제 소프트웨어 개발 프로세스에서 우리는 종종 다음 시나리오를 만듭니다. 모듈은 데이터를 생성 할 책임이 있으며이 데이터는 다른 모듈로 처리됩니다 (여기서 모듈은 일반화되어 클래스, 기능, 스레드, 프로세스 등).
데이터를 생성하는 모듈을 생생하게 생산자라고합니다. 데이터를 처리하는 모듈을 소비자라고합니다.
첫 번째 유형 : 대기하지 않음을 사용하여 생산자 및 소비자 모델을 구현하십시오.
1. 생산자와 소비자 :
2. 한 생산자와 여러 소비자 :
두 번째 유형 : 블록 큐를 사용하여 생산자 및 소비자 모델을 구현합니다.
3. 차단 대기열을 사용하여 생산자 소비자 패턴을 구현하십시오
나는 모두가 일본 요리에 갔다고 믿는다. 바베큐 인 매우 매력적인 식사가 있습니다. 바베큐 마스터는 옆에 서서 계속 바비큐를 한 다음 구운 고기를 접시에 넣습니다. 그리고 침을 흘리는 식당은 옆에 앉을 것이며 접시에 고기가있는 한 계속 먹을 것입니다.
이 생명의 경우, 바베큐 마스터는 프로듀서이며 바베큐를 책임집니다. 로스팅 후, 그는 고기를 접시에 식당에 직접 건네지 않고 접시에 넣습니다 (즉, 식당에 고기를 먹도록 알릴 필요가 없습니다). 접시의 고기가 가득 차면, 고기를 생산하기 전에 누군가 바베큐를 먹을 때까지 주인은 잠시 멈출 것입니다. 그리고 식당은 접시를 쳐다보고 있으며, 일단 접시에 고기가 있으면 우리는 그것을 먹을 책임이 있습니다.
전체 과정에서 식당과 바베큐 마스터는 서로 직접 다루지 않았지만 접시와 상호 작용했습니다.
플레이트는 버퍼 개념으로 작용합니다. 무언가가 생성되면 그것을 넣으십시오. 플레이트의 크기 제한도 있습니다. 플레이트의 크기를 초과하면 생산자의 생산을 차단하고 소비자가 소비되기를 기다립니다. 플레이트가 비어 있으면 소비자 소비를 차단하고 생산자가 생산할 때까지 기다립니다.
프로그래밍 중 대기열을 차단하면 디스크의 기능을 실현할 수 있습니다.
차단 대기열의 특성 :
큐 요소가 가득 차면 삽입 작업을 차단하십시오.
큐 요소가 비어 있으면 획득 작업이 차단됩니다.
ArrayBlockingqueue와 LinkedBlockingqueue는 FIFO (우선, 우선)를 지원하지만 LinkedBlockingQueue는 생존하지 않고 ArrayBlockingqueue가 제한되어 있습니다.
다음은 차단 대기열을 사용하여 생산자와 소비자를 구현합니다.
생산자:
import java.util.concurrent.blockingqueue; public class producer는 런닝 가능한 {private final blockingqueue blockingqueue; // 큐 캐시의 크기를 설정합니다. 생산 공정 에서이 규모를 초과 한 후 생산은 일시적으로 중지됩니다. 개인 최종 int queue_size = 10; public producer (blockingqueue blockingqueue) {this.blockingqueue = blockingqueue;} int task = 1; @override public void run () {while (true) {system.out.println ( "생산 :"+작업); EffectS.Sleep (1000);} Catch (InterpruptedException e) {E.printstacktrace ();}}}}}}소비자:
import java.util.concurrent.blockingqueue; // 소비자 공개 클래스 소비자 구현 실행 가능 {private final blockingqueue blockingqueue; public consumer (blockingqueue blockingqueue) {this.blockingqueue = blockingqueue;}@offeride public void run () {// blocking queue que queue que que que que que queue {// {System.out.println ( "소비 :" + blockingqueue.take ()); // 효과 스레드를보기 위해 잠시 멈추게하자 (2000);} catch (e.printstacktrace ();}}}}시험:
import java.util.concurrent.blockingqueue; import java.util.concurrent.linkedblockingqueue;/** * 제작자 소비자 모드 * 블록 큐 블록 큐어 사용 * @author wanggenshen * */public static void main (string [] args) {blockingue mews = LinkedBlockingqueue (5); 생산자 P = 새로운 생산자 (Blockingqueue); 소비자 C = 새로운 소비자 (Blockingqueue); 스레드 TP = 새로운 스레드 (P); 스레드 TC = 새 스레드 (C); TP.Start (); TC.Start ();}}LinkedBlockingqueue는 무한한 대기열이기 때문에 생산자는 계속 생산하고 생산 된 작업을 대기열에 넣고 소비자는 대기열에 소비합니다.
경계 차단 큐 arrayblockingqueue를 대신 사용하는 경우 큐 크기를 초기화 할 수 있습니다. 그런 다음 대기열의 요소가 큐 크기를 초과하면 생산자는 소비자가 하나를 소비하고 다른 것을 생산할 때까지 기다립니다.
테스트 코드 :
크기 10의 ArrayBlockingqueue 초기화 :
public static void main (string [] args) {Blockingqueue Blockingqueue = New ArrayBlockingqueue (10); 생산자 P = 새로운 생산자 (Blockingqueue); 소비자 C = 새로운 소비자 (Blockingqueue); 스레드 TP = 새 스레드 (P); 스레드 TC = 새 스레드 (C); TP.Start (); TC.start ();};시험 중에 생산자는 약간 더 빨리 생산할 수 있었고 소비자는 느리게 생산할 수있었습니다. 생성 된 제품 일련 번호와 소비 된 제품 일련 번호의 차이는 항상 10 (대기열의 크기)임을 알 수 있습니다.
요약
위는 생산 소비자 모델 구현 방법과 스레드 안전 문제의 코드 예에 대한이 기사의 전체 내용입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!