Java 병렬 프로그래밍에서의 생산자와 소비자 모델 약술

3239 단어 Java병발하다
개요
다중 루틴 프로그램에 대해 말하자면 생산자와 소비자 모델은 매우 고전적인 모델이다.더 정확히 말하면'생산자-소비자-창고모형'이라고 해야 한다.창고를 떠나면 생산자, 소비자는 공용 저장 공간이 부족하고 협업이 아닌 문제가 존재하지 않는다.
예제
장면을 정의합니다.창고 하나에 10개의 상품만 보관할 수 있고 생산자는 매번 그 안에 하나의 상품을 넣을 수 있으며 소비자는 그 중에서 하나의 상품을 꺼낼 수 있다.또한 다음 4가지 사항을 유의해야 합니다.
1. 같은 시간에 한 명의 생산자만 생산할 수 있고 생산 방법은synchronized를 잠가야 한다.
2. 같은 시간에 한 명의 소비자만 소비할 수 있고 소비 방법은synchronized를 잠가야 한다.
3. 창고가 비어 있을 때 소비자는 계속 소비할 수 없다.소비자가 소비하기 전에 현재 창고 상태가 비어 있는지 순환적으로 판단하고 비어 있으면 소비 라인은wait를 필요로 하며 자물쇠를 방출하여 다른 동기화 방법을 실행할 수 있도록 한다.
4. 창고가 가득 차면 생산자는 계속 생산할 수 없고 생산자의 생산돈은 현재 창고 상태가 가득 차는지 순환적으로 판단해야 한다. 가득 차면 생산 라인은wait를 필요로 하고 자물쇠를 풀어 다른 동기화 방법으로 실행할 수 있도록 해야 한다.
예제 코드는 다음과 같습니다.
  

 public class Concurrence { 
    public static void main(String[] args) { 
      WareHouse wareHouse = new WareHouse(); 
      Producer producer = new Producer(wareHouse); 
      Consumer consumer = new Consumer(wareHouse); 
   
      new Thread(producer).start(); 
      new Thread(consumer).start(); 
    } 
  } 
   
  class WareHouse { 
    private static final int STORE_SIZE = 10; 
    private String[] storeProducts = new String[STORE_SIZE]; 
    private int index = 0; 
   
    public void pushProduct(String product) { 
      synchronized (this) { 
        while (index == STORE_SIZE) { 
          try { 
            this.wait(); 
          } catch (InterruptedException e) { 
            e.printStackTrace(); 
          } 
        } 
   
        storeProducts[index++] = product; 
        this.notify(); 
   
        System.out.println(" : " + product + " ,  : " + index 
            + "  "); 
      } 
    } 
   
    public synchronized String getProduct() { 
      synchronized (this) { 
        while (index == 0) { 
          try { 
            this.wait(); 
          } catch (InterruptedException e) { 
            e.printStackTrace(); 
          } 
        } 
   
        String product = storeProducts[index - 1]; 
        index--; 
        System.out.println(" : " + product + ",  : " + index 
            + "  "); 
        this.notify(); 
        return product; 
      } 
    } 
  } 
   
  class Producer implements Runnable { 
    WareHouse wareHouse; 
   
    public Producer(WareHouse wh) { 
      this.wareHouse = wh; 
    } 
   
    @Override 
    public void run() { 
      for (int i = 0; i < 40; i++) { 
        String product = "product" + i; 
        this.wareHouse.pushProduct(product); 
      } 
    } 
  } 
   
  class Consumer implements Runnable { 
    WareHouse wareHouse; 
   
    public Consumer(WareHouse wh) { 
      this.wareHouse = wh; 
    } 
   
    @Override 
    public void run() { 
      for (int i = 0; i < 40; i++) { 
        this.wareHouse.getProduct(); 
      } 
    } 
  } 

좋은 웹페이지 즐겨찾기