生産者と消費者Javaの実現

2570 ワード

Containerクラス
package multithread.producerandconsumer;

public class Container {
	static int size=5;
	int index=0;
	String [] container=new String[size];
	
	
	synchronized public void add(String production){
		if(index>=size){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			
		}
		container[index]=production;
		System.out.println("P-"+Thread.currentThread().getName()+" produce "+container[index]+" production");
		index++;
		notify();
	}
	
	synchronized public void remove(){
		if(index==0){
			try {
				wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		index--;
		System.out.println("C-"+Thread.currentThread().getName()+" consume "+container[index]+" production");
		container[index]=null;
		notify();
		
	}
}

Producerクラス
package multithread.producerandconsumer;

public class Producer implements Runnable {
	Container container=null;
	Producer(Container container){
		this.container=container;
	}
	@Override
	public void run() {
		long proId=0;
		while(true){
			
			proId++;
			container.add(proId+"NO.");
			if(proId==10)
				break;
		}
	}
}

Consumerクラス
package multithread.producerandconsumer;

public class Consumer implements Runnable {
	Container container=null;
	Consumer(Container container){
		this.container=container;
	}
	@Override
	public void run() {
		for(int i=0;i<10;i++){
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			container.remove();
		}
	}

}

テストクラス
package multithread.producerandconsumer;

public class TestProduceAndConsume {

	public static void main(String[] args) {
		Container container=new Container();
		Producer prod=new Producer(container);
		Consumer consumer=new Consumer(container);
		new Thread(prod).start();
		new Thread(consumer).start();
//		new Thread(consumer).start();
//		new Thread(consumer).start();
	}
}