Java生產者消費者

Java生產者消費者

一、單生產者單消費者

/**
 * <p>Title: ProducerConsumerDemo</p>
 * <p>Description: ProducerConsumerDemo</p>
 */
public class ProducerConsumerDemo {
	
	/**
	 * 主函數
	 * <p>Title: main</p>
	 * <p>Description: 主函數</p>
	 * @param args
	 */
	public static void main(String[] args) {
		Resource resource = new Resource();
		
		Producer producer = new Producer(resource);
		Consumer consumer = new Consumer(resource);
		
		Thread producerThread = new Thread(producer);
		Thread consumerThread = new Thread(consumer);
		
		producerThread.start();
		consumerThread.start();
	}
	
}

/**
 * 生產者
 * <p>Title: Producer</p>
 * <p>Description: 生產者</p>
 */
class Producer implements Runnable {
	
	Resource resource;
	
	/**
	 * <p>Title: 構造器</p>
	 * <p>Description: 構造器</p>
	 */
	public Producer(Resource resource) {
		this.resource = resource;
	}

	/* (non-Javadoc)
	 * <p>Title: run</p>
	 * <p>Description: </p>
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		while(true) {
			resource.produce("麪包");
		}
	}
	
}

/**
 * 消費者
 * <p>Title: Consumer</p>
 * <p>Description: 消費者</p>
 */
class Consumer implements Runnable {
	
	Resource resource;
	
	/**
	 * <p>Title: 構造器</p>
	 * <p>Description: 構造器</p>
	 */
	public Consumer(Resource resource) {
		this.resource = resource;
	}

	/* (non-Javadoc)
	 * <p>Title: run</p>
	 * <p>Description: </p>
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		while(true) {
			resource.consume();
		}
	}
	
}

/**
 * 資源
 * <p>Title: Resource</p>
 * <p>Description: 資源</p>
 */
class Resource {
	
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	/**
	 * 生產資源
	 * <p>Title: produce</p>
	 * <p>Description: 生產資源</p>
	 * @param name
	 */
	public synchronized void produce(String name) {
		if (flag) {
			try {this.wait();} catch (InterruptedException e) {e.getMessage();}
		}
		this.name = name + count;
		count++;
		System.out.println(Thread.currentThread().getName() + "......生產。。。。。。" + this.name);
		flag = true;
		this.notify();
	}
	
	/**
	 * 消費資源
	 * <p>Title: consume</p>
	 * <p>Description: 消費資源</p>
	 */
	public synchronized void consume() {
		if (!flag) {
			try {this.wait();} catch (InterruptedException e) {e.getMessage();}
		}
		System.out.println(Thread.currentThread().getName() + "............消費......。。。。。。" + this.name);
		flag = false;
		this.notify();
	}
	
}

二、多生產者多消費者

/**
 * <p>Title: MultiProducerConsumerDemo</p>
 * <p>Description: MultiProducerConsumerDemo</p>
 */
public class MultiProducerConsumerDemo {
	
	/**
	 * 主函數
	 * <p>Title: main</p>
	 * <p>Description: 主函數</p>
	 * @param args
	 */
	public static void main(String[] args) {
		Resources resource = new Resources();
		
		MultiProducer producer = new MultiProducer(resource);
		MultiConsumer consumer = new MultiConsumer(resource);
		
		Thread t0 = new Thread(producer);
		Thread t1 = new Thread(producer);
		Thread t2 = new Thread(consumer);
		Thread t3 = new Thread(consumer);
		
		t0.start();
		t1.start();
		t2.start();
		t3.start();
	}
	
}

/**
 * 多生產者
 * <p>Title: Producer</p>
 * <p>Description: 多生產者</p>
 */
class MultiProducer implements Runnable {
	
	Resources resource;
	
	/**
	 * <p>Title: 構造器</p>
	 * <p>Description: 構造器</p>
	 */
	public MultiProducer(Resources resource) {
		this.resource = resource;
	}

	/* (non-Javadoc)
	 * <p>Title: run</p>
	 * <p>Description: </p>
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		while(true) {
			resource.produce("麪包");
		}
	}
	
}

/**
 * 多消費者
 * <p>Title: Consumer</p>
 * <p>Description: 多消費者</p>
 */
class MultiConsumer implements Runnable {
	
	Resources resource;
	
	/**
	 * <p>Title: 構造器</p>
	 * <p>Description: 構造器</p>
	 */
	public MultiConsumer(Resources resource) {
		this.resource = resource;
	}

	/* (non-Javadoc)
	 * <p>Title: run</p>
	 * <p>Description: </p>
	 * @see java.lang.Runnable#run()
	 */
	@Override
	public void run() {
		while(true) {
			resource.consume();
		}
	}
	
}

/**
 * 資源
 * <p>Title: Resource</p>
 * <p>Description: 資源</p>
 */
class Resources {
	
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	/**
	 * 生產資源
	 * <p>Title: produce</p>
	 * <p>Description: 生產資源</p>
	 * @param name
	 */
	public synchronized void produce(String name) {
		while (flag) {
			try {this.wait();} catch (InterruptedException e) {e.getMessage();}
		}
		this.name = name + count;
		count++;
		System.out.println(Thread.currentThread().getName() + "......生產。。。。。。" + this.name);
		flag = true;
		this.notifyAll();
	}
	
	/**
	 * 消費資源
	 * <p>Title: consume</p>
	 * <p>Description: 消費資源</p>
	 */
	public synchronized void consume() {
		while (!flag) {
			try {this.wait();} catch (InterruptedException e) {e.getMessage();}
		}
		System.out.println(Thread.currentThread().getName() + "............消費......。。。。。。" + this.name);
		flag = false;
		this.notifyAll();
	}
	
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章