Skip to content

Latest commit

 

History

History
145 lines (117 loc) · 2.4 KB

生产者和消费者问题.md

File metadata and controls

145 lines (117 loc) · 2.4 KB
title date categories tags
生产者消费者问题
2017-03-07
javaSE
JavaConcurrent
package 生产者消费者;

public class ProducerConsumerTest {

	public static void main(String[] args) {
		PublicResource resource = new PublicResource();
		new Thread(new ProducerThread(resource)).start();
        new Thread(new ConsumerThread(resource)).start();
        new Thread(new ProducerThread(resource)).start();
        new Thread(new ConsumerThread(resource)).start();
        new Thread(new ProducerThread(resource)).start();
        new Thread(new ConsumerThread(resource)).start();
	}
}
package 生产者消费者;
/**
 * 生产者线程,负责生产公共资源
 * @author dream
 *
 */
public class ProducerThread implements Runnable{

	private PublicResource resource;

	
	public ProducerThread(PublicResource resource) {
		this.resource = resource;
	}


	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep((long) (Math.random() * 1000));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			resource.increase();
		}
	}
	
	
}
package 生产者消费者;

/**
 * 消费者线程,负责消费公共资源
 * @author dream
 *
 */
public class ConsumerThread implements Runnable{

	private PublicResource resource;
	
	
	public ConsumerThread(PublicResource resource) {
		this.resource = resource;
	}


	@Override
	public void run() {
		while (true) {
			try {
				Thread.sleep((long) (Math.random() * 1000));
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			resource.decrease();
		}
		
	}
	

}
package 生产者消费者;

/**
 * 公共资源类
 * @author dream
 *
 */
public class PublicResource {

	private int number = 0;
	private int size = 10;
	
	/**
	 * 增加公共资源
	 */
	public synchronized void increase()
	{
		while (number >= size) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		number++;
		System.out.println("生产了1个,总共有" + number);
		notifyAll();
	}
	
	
	/**
	 * 减少公共资源
	 */
	public synchronized void decrease()
	{
		while (number <= 0) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		number--;
		System.out.println("消费了1个,总共有" + number);
		notifyAll();
	}
}