熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

哲學家進餐問題,java實現

2013-11-23 18:49:20  來源: Java核心技術 

  public class Scientist extends Thread {

      /*

       * @authorBore

       * @mailz

       * @time//

       * 哲學家進餐個哲學家只筷子

       * 哲學家通過getChopsticks()方法來取筷子

       * 當哲學家同時獲得左邊和右邊兩只筷子後才可以進餐否則把已經得到的筷子也釋放

       * 如果一直筷子也沒有進程阻塞等待其他哲學家釋放資源

       * 進程後釋放已經獲得的資源

       */

  

      static byte[] chopsticks={};//五只筷子

  

      public Scientist(String name){

          super(name);

      }

      public void run() {

          getChopsticks();

      }

  

      public void getChopsticks(){//開始搶筷子

          int tem=IntegerparseInt(thisgetName()substring());//獲取哲學家編號

          if(tem==){//如果是第一位科學家先搶左邊的筷子

              if(leftChopsticks(tem)){//如何獲取了左邊的筷子

                  if(rightChopsticks(tem)){//如果獲取了右邊的筷子

                      eating();//開始吃飯

                      freeLeftChopsticks(tem);//釋放左邊筷子

                      freeRightChopsticks(tem);//釋放右邊筷子

                  }else{

                      freeLeftChopsticks(tem);

                      Systemoutprintln(由於+thisgetName()+無法獲得右手邊的筷子所以他把已獲得的左手的筷子也釋放了!);

                      try {

                          thissleep();

                      } catch (InterruptedException e) {

                          eprintStackTrace();

                      }

                      getChopsticks();

                  }

              }else{

                  Systemoutprintln(thisgetName()+暫時無法獲取兩只筷子准備休眠!);

                  try {

                      thissleep();

                  } catch (InterruptedException e) {

                      eprintStackTrace();

                  }

                  getChopsticks();

  

              }

          }else{//其他情況先搶右邊的筷子

              if(rightChopsticks(tem)){//先搶右手邊的筷子

                  if(leftChopsticks(tem)){//如果獲得了右手邊的去搶左手邊的筷子

                      eating();//如果獲得了兩只筷子開始吃飯

                      freeLeftChopsticks(tem);//吃完了釋放左手邊的筷子

                      freeRightChopsticks(tem);//釋放右手邊的筷子

                  }else{

                      freeRightChopsticks(tem);

                      Systemoutprintln(由於+thisgetName()+無法獲得左手邊的筷子所以他把已獲得的右手的筷子也釋放了!);

                      try {

                          thissleep();

                      } catch (InterruptedException e) {

                          eprintStackTrace();

                      }

                      getChopsticks();

                  }

              }else{

                  Systemoutprintln(thisgetName()+暫時無法獲取兩只筷子准備休眠!);

                  try {

                      thissleep();

                  } catch (InterruptedException e) {

                      eprintStackTrace();

                  }

                  getChopsticks();

              }

          }

  

  

      }

  

      public boolean leftChopsticks(int tem){//獲取左手邊筷子

          if(chopsticks[tem]==){

              chopsticks[tem]=;

              Systemoutprintln(thisgetName()+左手邊筷子已獲得!);

              return true;

          }else{

              Systemoutprintln(thisgetName()+左手邊筷子已被哲學家+(tem)+搶走!);

              return false;

          }

      }

  

      public boolean rightChopsticks(int tem){//獲取右手邊筷子

          int i=(tem+)%;

          if(chopsticks[i]==){

              chopsticks[i]=;

              Systemoutprintln(thisgetName()+右手邊筷子已獲得!);

              return true;

          }else{

              Systemoutprintln(thisgetName()+右手邊筷子已被哲學家+i+搶走!);

              return false;

          }

      }

  

      public void freeLeftChopsticks(int tem){//獲取左手邊筷子

              chopsticks[tem]=;

              Systemoutprintln(thisgetName()+左手邊筷子已釋放!);

      }

  

      public void freeRightChopsticks(int tem){//獲取右手邊筷子

          int i=(tem+)%;

          chopsticks[i]=;

          Systemoutprintln(thisgetName()+右手邊筷子已釋放!);

      }

  

      public void eating(){//開始進餐

          Systemoutprintln(*+thisgetName()+兩只手都有了筷子所以開始吃飯!);

      }

  

  

  

      /**

       * 主函數

       */

      public static void main(String[] args) {

          for(int i=; i<; i++){

              new Scientist(哲學家+i)start();

          }

      }

  

  }


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25798.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.