生產者消費者問題

最近複習了下操作系統中相關內容,看到多線程同步問題,這個問題的典型案例的就是生產者,消費者問題,我昨晚利用了點時間寫了個生產者消費者的小程序,權當自己複習一下基礎知識。

程序主要有兩個線程,一個生產者線程,一個消費者線程,生產者負責生產產品(,每隔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();
	}
}

運行結果如圖所示


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