日期:2014-05-20 浏览次数:20780 次
public class EatingNoodles {
//实例化三个工人
Worker a = new Worker("A" ,1) ;
Worker b = new Worker("B" ,1) ;
Worker c = new Worker("C" ,1) ;
public void start(){
//三个工人吃面条的线程
EatingThread et1 = new EatingThread(a , b) ;
EatingThread et2 = new EatingThread(b , c) ;
EatingThread et3 = new EatingThread(c , a) ;
et1.start() ;
et2.start() ;
et3.start() ;
//初始化,首先b将1支筷子交给a ,并通知a可以开始吃面条了
synchronized (a) {
b.giveKz(a , 1);
a.notify() ;
}
}
public static void main(String[] args) {
new EatingNoodles().start() ;
}
class EatingThread extends Thread{
Worker worker ;
Worker next ; //排在当前工人的下一个人
public EatingThread(Worker worker , Worker next){
this.worker = worker ;
this.next = next ;
}
@Override
public void run() {
synchronized (worker) {
while(true){
if(worker.kzCount >= 2){ //至少有两根筷子就吃面条
worker.eat() ;
worker.giveKz(next ,2) ; //两只筷子都给下一个人
synchronized (next) {
next.notify(); //通知下一个人可以吃面条了
}
}else{ //否则就等待
try {
worker.wait() ;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
/*
* 工人
* */
class Worker{
String name ;
int kzCount ; //筷子数量
public Worker(String name , int kzCount){
this.name = name ;
this.kzCount = kzCount ;
}
public void eat(){
System.out.println(name + "吃面条...");
try {
Thread.sleep(1000); //睡眠1s,来表示吃面条的过程
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/*交出筷子*/
public void giveKz(Worker to , int count){
this.kzCount -= count ;
to.kzCount += count ;
System.out.printf("%s交出%d支筷子给%s, 【目前%s有%d支筷子 ,%s有%d支筷子 ,%s有%d支筷子】\n" ,
this.name , count , to.name ,
a.name , a.kzCount ,
b.name , b.kzCount ,
c.name , c.kzCount);
}
}
}
B交出1支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...
C交出2支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...
C交出2支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...
C交出2支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...
C交出2支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...
C交出2支筷子给A, 【目前A有2支筷子 ,B有0支筷子 ,C有1支筷子】
A吃面条...
A交出2支筷子给B, 【目前A有0支筷子 ,B有2支筷子 ,C有1支筷子】
B吃面条...
B交出2支筷子给C, 【目前A有0支筷子 ,B有0支筷子 ,C有3支筷子】
C吃面条...