자바 동시 제어 고전 장면-생산자/소비자

더 읽 기
자바 병행 제어 네 가지 방법:
1.wait()/notify();
2. await() / signal() ;
3.BlockingQueue 대기 열 차단 방법;
4.PipedInputStream / PipedOutputStream
가장 많이 사용 되 는 것 은 wait()/notify()입 니 다.간단 한 demo 참조 코드:
 
 
창고 종류:
import java.util.LinkedList;

public class Storage {

	public static final int MAX_SIZE = 100;

	private LinkedList list = new LinkedList();

	public void produce(int num) {
		synchronized (list) {
			while (num + list.size() > Storage.MAX_SIZE) {
				System.out.println("        :" + num + "   "
						+ list.size() + "         ");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 0; i < num; i++) {
				list.add(new Object());
			}
			System.out.println("       :" + num + "     :" + list.size());
			list.notifyAll();
		}
	}

	public void consume(int num) {
		synchronized (list) {
			while (num > list.size()) {
				System.out.println("        :" + num + "   :"
						+ list.size() + "          !");
				try {
					list.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}

			for (int i = 1; i <= num; ++i) {
				list.remove();
			}

			System.out.println("       :" + num + "     :" + list.size());

			list.notifyAll();
		}
	}

	public LinkedList getList() {
		return list;
	}

	public void setList(LinkedList list) {
		this.list = list;
	}
	
}

 생산자 종류:
public class Producer implements Runnable {
	private int num;
	
	private Storage storage;
	
	public Producer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.produce();
	}
	
	public void produce(){
		this.storage.produce(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}

}

 소비자 클래스:
public class Consumer implements Runnable {
	
	private int num;
	
	private Storage storage;
	
	public Consumer(Storage storage){
		this.storage = storage;
	}

	@Override
	public void run() {
		this.consume();
	}
	
	private void consume(){
		this.storage.consume(this.num);
	}

	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public Storage getStorage() {
		return storage;
	}

	public void setStorage(Storage storage) {
		this.storage = storage;
	}
	
	
	
}

 테스트 방법 클래스:
public class SysTest {
	public static void main(String[] args) {
		Storage storage = new Storage();
		Producer pt1 = new Producer(storage);
		pt1.setNum(10);
		Producer pt2 = new Producer(storage);
		pt2.setNum(10);
		Producer pt3 = new Producer(storage);
		pt3.setNum(10);
		Producer pt4 = new Producer(storage);
		pt4.setNum(10);
		Producer pt5 = new Producer(storage);
		pt5.setNum(10);
		Producer pt6 = new Producer(storage);
		pt6.setNum(10);
		Producer pt7 = new Producer(storage);
		pt7.setNum(80);
		
		
		Thread p1 = new Thread(pt1);
		Thread p2 = new Thread(pt2);
		Thread p3 = new Thread(pt3);
		Thread p4 = new Thread(pt4);
		Thread p5 = new Thread(pt5);
		Thread p6 = new Thread(pt6);
		Thread p7 = new Thread(pt7);
		
		
		Consumer ct1 = new Consumer(storage);
		ct1.setNum(50);
		Consumer ct2 = new Consumer(storage);
		ct2.setNum(20);
		Consumer ct3 = new Consumer(storage);
		ct3.setNum(30);
		
		Thread c1 = new Thread(ct1);
		Thread c2 = new Thread(ct2);
		Thread c3 = new Thread(ct3);
		
		
		c1.start();
		c2.start();
		c3.start();
		
		p1.start();
		p2.start();
		p3.start();
		p4.start();
		p5.start();
		p6.start();
		p7.start();
		
	}
}

 결과:
소비 할 제품 수량:50 재 고량:0 잠시 소비 임 무 를 수행 할 수 없습니다!소비 할 제품 수량:30 재 고량:0 잠시 소비 임 무 를 수행 할 수 없습니다!이미 생산 된 제품 수:10 재고 저장량:10 소비 할 제품 수량:30 재 고량:10 잠시 소비 임 무 를 수행 할 수 없습니다!소비 할 제품 수량:20 재 고량:10 당분간 소비 임 무 를 수행 할 수 없습니다!소비 할 제품 수량:50 재 고량:10 잠시 소비 임 무 를 수행 할 수 없습니다!이미 생산 된 제품 수:10 현 고 저장량 은:20 이미 생산 된 제품 수:10 현 고 저장량 은:30 이미 생산 된 제품 수:10 현 고 저장량 은:40 소비 할 제품 수량:50 재 고량:40 잠시 소비 임 무 를 수행 할 수 없습니다!이미 소비 제품 수:20 재고 저장량:20 소비 할 제품 수량:30 재 고량:20 잠시 소비 임 무 를 수행 할 수 없습니다!이미 생산 된 제품 수:10 재고 저장량:30 소비 할 제품 수량:50 재 고량:30 잠시 소비 임 무 를 수행 할 수 없습니다!생산 할 제품 수량:80 재 고량 30 잠시 생산 임 무 를 수행 할 수 없습니다 이미 소비 제품 수:30 재고 저장량:0 이미 생산 제품 수:10 재고 저장량:10 이미 생산 제품 수:80 재고 저장량:90 이미 소비 제품 수:50 재고 저장량:40

좋은 웹페이지 즐겨찾기