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();
	}
	
}

 

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