<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java學(xué)習(xí)

    java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對(duì)文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

     

    java解 哲學(xué)家就餐問題

    哲學(xué)家進(jìn)餐問題是一個(gè)多線程運(yùn)用的經(jīng)典例子,涉及到線程同步/互斥,臨界區(qū)訪問問題以及一個(gè)避免死鎖的解決方法。

         有五個(gè)哲學(xué)家繞著圓桌坐,每個(gè)哲學(xué)家面前有一盤面,兩人之間有一支筷子,這樣每個(gè)哲學(xué)家左右各有一支筷子。

       哲學(xué)家有2個(gè)狀態(tài),思考或者拿起筷子吃飯。如果哲學(xué)家拿到一只筷子,不能吃飯,直到拿到2只才能吃飯,并且一次只能拿起身邊的一支筷子。一旦拿起便不會(huì)放下筷子直到把飯吃完,此時(shí)才把這雙筷子放回原處。

       如果,很不幸地,每個(gè)哲學(xué)家拿起他或她左邊的筷子,那么就沒有人可以吃到飯了。這就會(huì)造成死鎖了。。這是需要堅(jiān)決杜絕的,正如操作系統(tǒng)的死鎖問題。
                                                                                         
    代碼如下:
    import java.util.Random;
    public class DiningPhils
    {
    public static void main(String[] args)
    {
    int n = 10;
    if( n < 1)
    {
    System.err.println( "DiningPils <# of philosophers>" );
    System.exit(-1);
    }
    DiningPhils self = new DiningPhils();
    self.init(n);
    }

    public int getCount()
    {
    return n;
    }
    public void setChopstick( int i, boolean v)
    {
    chops[ i ] = v;
    }
    public boolean getChopstick( int i )
    {
    return chops[i];
    }

    private void init( final int N)
    {
    r = new Random();
    n = ( N < 0 || N > maxPhils ) ? maxPhils : N;
    chops = new boolean[n];
    phils = new Philosopher[n];
    initPhils();
    dumpStatus();
    }
    private void initPhils()
    {
    for( int i = 0; i< n; i++ )
    {
    phils[i] = new Philosopher( this, i );
    phils[i].setTimeSlice( generateTimeSlice());
    phils[i].setPriority( Thread.NORM_PRIORITY - 1);
    /**哲學(xué)家進(jìn)程降低一級(jí),使所有哲學(xué)家進(jìn)程
    *全部初始化完畢前不會(huì)有哲學(xué)家進(jìn)程搶占主線程*/
    }
    while( moreToStart() )
    {
    int i = Math.abs( r.nextInt()) % n;
    if( !phils[i].isAlive())
    {
    System.out.println( " ### Philosopher " +
    String.valueOf( i ) + " started.");
    phils[i].start();
    }
    }
    System.out.println( "\nPhilosophers Chopsticks"
    + "\n(1 = eating, 0 = thinking) (1 = taken, 0 = free)");
    }
    public int generateTimeSlice()
    {
    int ts = Math.abs(r.nextInt()) % (maxEat + 1);
    if( ts == 0 )
    ts = minEat;
    return ts;
    }
    public void dumpStatus()
    {
    for( int i = 0; i < n; i++)
    System.out.print(phils[i].getEat() ? 1 : 0);
    for( int i = n; i < maxPhils + 4; i++ )
    System.out.print(" ");
    for( int i = 0; i < n; i++)
    System.out.print(chops[i]? 1:0);
    System.out.println();
    }

    private boolean moreToStart()
    {
    for( int i = 0; i < phils.length; i++ )
    {
    if( !phils[i].isAlive())
    return true;
    }
    return false;
    }
    private int n;
    private Philosopher[] phils;
    private boolean[] chops;
    private Random r;
    private static final int maxPhils = 24; //最多哲學(xué)家數(shù)
    private static final int maxEat = 4; //最多進(jìn)餐時(shí)間
    private static final int minEat = 1; //最少進(jìn)餐時(shí)間
    }
    class Philosopher extends Thread
    {
    public Philosopher( DiningPhils HOST , int i )
    {
    host = HOST;
    index = i;
    }
    public void setTimeSlice( int TS )
    {
    ts = TS;
    }
    public void setLeftChopstick( boolean flag )
    {
    host.setChopstick(index, flag);
    }
    public void setRightChopstick( boolean flag )
    {
    host.setChopstick((index + 1)% host.getCount() , flag);
    }
    private void releaseChopsticks()
    {
    setLeftChopstick(false);
    setRightChopstick(false);
    }
    public boolean chopsticksFree()
    {
    return !host.getChopstick(index) &&
    !host.getChopstick((index+1)%host.getCount());
    }

    public void run()
    {
    while(true)
    {
    grabChopsticks();
    eat();
    think();
    }
    }
    private synchronized void grabChopsticks() /**臨界區(qū)函數(shù),確保哲學(xué)家在沒有筷子或筷子不夠時(shí)思考,滿足條件后才就餐*/
    {
    while( !chopsticksFree())
    {
    try
    {
    wait();
    }
    catch( InterruptedException e){}
    }
    takeChopsticks();
    notifyAll();
    }
    private void takeChopsticks()
    {
    setLeftChopstick( true );
    setRightChopstick( true );
    setEat(true);
    host.dumpStatus();
    }
    private void eat()
    {
    pause();
    setEat( false );
    releaseChopsticks();
    }
    private void think()
    {
    pause();
    }
    private void pause()
    {
    setTimeSlice( host.generateTimeSlice());
    try
    {
    sleep(ts*1000);
    }
    catch( InterruptedException e){}
    }
    private void setEat(boolean v)
    {
    isEating = v;
    }
    public boolean getEat()
    {
    return isEating;
    }
    private DiningPhils host;
    private boolean isEating;
    private int index;
    private int ts;
    }

    posted on 2008-07-15 16:51 找個(gè)美女做老婆 閱讀(616) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
     http://www.javaly.cn

    常用鏈接

    留言簿(6)

    隨筆檔案

    文章檔案

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 亚洲无限乱码一二三四区| 无码欧精品亚洲日韩一区夜夜嗨| 久久亚洲国产精品一区二区| 免费福利资源站在线视频| 日韩毛片免费在线观看| 亚洲日韩精品无码专区加勒比| 在线观看免费人成视频色| 亚洲欧洲精品久久| 黄色网址免费观看| 色在线亚洲视频www| 国产免费久久精品99re丫y| 亚洲高清有码中文字| 日韩免费三级电影| 免费无毒a网站在线观看| 三上悠亚亚洲一区高清| a级片免费观看视频| 久久久久久亚洲Av无码精品专口| 无码国产精品一区二区免费式影视| 亚洲乱码卡一卡二卡三| 免费无码成人AV片在线在线播放| 无码色偷偷亚洲国内自拍| 久久亚洲欧洲国产综合| 亚欧免费无码aⅴ在线观看| 亚洲成AV人片久久| 免费无码又爽又刺激高潮的视频| 色多多A级毛片免费看| 亚洲视频在线观看网址| 国产又黄又爽又猛免费app| 含羞草国产亚洲精品岁国产精品| 亚洲午夜日韩高清一区| 久久不见久久见免费视频7| 亚洲永久在线观看| 国产成人精品亚洲精品| 中国xxxxx高清免费看视频| 亚洲av成人片在线观看| 亚洲男同帅GAY片在线观看| 男女免费观看在线爽爽爽视频 | 国产成人免费ā片在线观看| 五级黄18以上免费看| 久久亚洲私人国产精品vA| 国产片免费福利片永久|