生产者消费者问题

最近复习了下操作系统中相关内容,看到多线程同步问题,这个问题的典型案例的就是生产者,消费者问题,我昨晚利用了点时间写了个生产者消费者的小程序,权当自己复习一下基础知识。

程序主要有两个线程,一个生产者线程,一个消费者线程,生产者负责生产产品(,每隔1s生产一个产品,最多生产20个),当当前未被消费者消费的产品满20个后,生产者就不会生产产品,直到有产品产品少于20个,消费者每隔3s消费一次产品,每次消费生产者刚刚生产出的产品,如果没有产品,消费者就放弃此次消费,直到有新产品可以消费。

package com.jackchan;

public class ConsumerProducer {
	class Thing{
		int i = 0;//指向当前的空位置(共20个位置)
		public synchronized void producing(){
			if(i == 20){//货物已经生产满了,无空位置
				return;
			}
			else{
				System.out.println("Producer " + i);//生产产品到第i位置
				i++;//指向下一个空位置
			}
		}
		
		public synchronized void consuming(){
			if(i == 0){//货物已经取完了
				return;
			}
			else{
				i--;//当前空位置的前一个货物被取走
				System.out.println("Consumer " + i);//取走货物的位置
			}
		}
	}
	public static void main(String[] args){
		
		final Thing thing = new ConsumerProducer().new Thing();
		Runnable producer = new Runnable() {
			
			@Override
			public void run() {
				while(true){
					try {
						thing.producing();
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		Runnable consumer = new Runnable() {
			
			@Override
			public void run() {
				while(true){
					try{
						thing.consuming();
						Thread.sleep(3000);
					}catch(InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		};
		
		Thread ProducerThread = new Thread(producer);
		ProducerThread.start();
		Thread ConsumerThread = new Thread(consumer);
		ConsumerThread.start();
	}
}

运行结果如图所示

生产者消费者问题_第1张图片

你可能感兴趣的:(多线程,消费者,生产者)