解决方案 »

  1.   

    系统随机分配筷子归属,然后做判断:
    如果(筷子数量=1){
    用手抓着吃
    }否则 如果(筷子数量=2){
    用筷子夹着吃
    }else{
    用手抓着吃
    }
      

  2.   

    看到后面的这些回复,我还以为我从csdn穿越到网易了。
      

  3.   

    顺序的吃不行吗?为啥要多线程?
    int index = 0;
    while(面条还有){
      index ++;
      if(index>3) index = 1;
      if(index == 1)  农民1.吃();
      else if(index == 2)  农民2.吃();
      else if(index == 3)  农民3.吃();
      面条--;
    }农民.吃面(){
      拿左右两只筷子;
      用筷子吃面;
    }
      

  4.   


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

  5.   

    哲学家进餐问题,这个在学习操作系统的时候遇到过,可以利用AND信号量机制解决。
      

  6.   

    给出结果,然后卡死,cpu占用98%