java 大數據(多線程)和尚分饅頭 整理

Box 箱子類、Monk和尚類、App測試類

Box 箱子類

package com.xc.thread.monk;

/**
 * 饅頭箱子
 * @author Administrator
 *
 */
public class Box {
	private int count =100;
	
	public synchronized int getMantou(Monk m) {
		//判斷箱子裏是否還有饅頭
		if(count==0) {
			//打印和尚的姓名和拿到的饅頭
			System.out.println(m.getName()+":"+m.getCount());
			//返回0
			return 0;
		}
		int mCount=m.getCount();
		//當和尚的饅頭值爲最大值,就不允許再走
		if(mCount == Monk.MAX) {
			//終止線程
			//m.interrupt();
			//打印和尚的姓名和拿到的饅頭
			System.out.println(m.getName()+":"+m.getCount());
			return 0;
		}
		
		
		//獲取count原始值
		int currCount=count;
		//喫饅頭
		count--;
		//當饅頭數量大於70
		if(count > 70) {
			try {
				//放入等待隊列
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}else {
			//喚醒線程
			this.notifyAll();
		}
		return currCount;
	}


}

 

Monk和尚類

package com.xc.thread.monk;

import java.util.Random;

/**
 * 和尚
 * @author Administrator
 *
 */
public class Monk extends Thread{

	private int count;
	
	//箱子
	private Box box;
	
	//最大值爲5
	static int MAX=5;
	
	//和尚名字
	private String name;
	
	//構造函數
	public Monk(String name,Box box) {
		this.name=name;
		this.box=box;
	}
	
	public void run() {
		while(true) {
			//獲取饅頭數量
			int n=box.getMantou(this);
			try {
				//取隨機值,休眠時間
				Thread.sleep(new Random().nextInt(5));
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//如果爲0,表示箱子裏沒有饅頭了
			if(n==0) {
				return;
			}else {
				//喫完一個+1
				count++;
				//System.out.println(name+":"+count);
			}
		}
	}
	public int getCount() {
		return count;
	}
}

 

App測試類

package com.xc.thread.monk;

public class App {

	public static void main(String[] args) {
		//饅頭箱子
		Box box=new Box();
		//30個和尚取饅頭
		for(int i=0;i<30;i++) {
			//創建
			new Monk("Monk"+i, box).start();
		}

	}

}

打印結果 

 

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