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();
}
}
}
打印結果