日期:2014-05-20  浏览次数:20780 次

面试碰到的问题:三个农民围在一张桌子吃面条。。
三个农民围在一张桌子吃面条,每两个人之间有一只筷子。写一个多线程出来,每个农民都能吃到,不能饿死。。
哪位大神指导一下?
------解决方案--------------------
这个问题很老了。主要考虑的是现成同步的问题。

这个问题可以有多个解决方案
1、可以为每个农民编上号,1.2.3,1号的优先级最大,3号的优先级最小,优先级高的农民可以从优先级低的农民手上抢夺筷子。
2、要求必须一次性拿到两只筷子,如果拿到了第一支筷子,而拿第二只筷子的时候失败了,则自动释放第一支筷子。

等等,其实应该还有更多的解决方案的。
------解决方案--------------------



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吃面条...