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

	}

}

打印结果 

java 大数据(多线程)和尚分馒头 整理_第1张图片

 

你可能感兴趣的:(java大数据)