最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

哲學家就餐問題中的JAVA多線程學習

 更新時間:2013年11月25日 16:18:41   作者:  
哲學家就餐問題是1965年由Dijkstra提出的一種線程同步的問題,下面我們就看一下JAVA多線程如何做

問題描述:一圓桌前坐著5位哲學家,兩個人中間有一只筷子,桌子中央有面條。哲學家思考問題,當餓了的時候拿起左右兩只筷子吃飯,必須拿到兩只筷子才能吃飯。上述問題會產(chǎn)生死鎖的情況,當5個哲學家都拿起自己右手邊的筷子,準備拿左手邊的筷子時產(chǎn)生死鎖現(xiàn)象。

解決辦法:

1、添加一個服務生,只有當經(jīng)過服務生同意之后才能拿筷子,服務生負責避免死鎖發(fā)生。

2、每個哲學家必須確定自己左右手的筷子都可用的時候,才能同時拿起兩只筷子進餐,吃完之后同時放下兩只筷子。

3、規(guī)定每個哲學家拿筷子時必須拿序號小的那只,這樣最后一位未拿到筷子的哲學家只剩下序號大的那只筷子,不能拿起,剩下的這只筷子就可以被其他哲學家使用,避免了死鎖。這種情況不能很好的利用資源。 

代碼實現(xiàn):實現(xiàn)第2種方案

復制代碼 代碼如下:

package cn.edu.sdust.Philosopher;


/*每個哲學家相當于一個線程*/
class Philosopher extends Thread{
    private String name;
    private Fork fork;
    public Philosopher(String name,Fork fork){
        super(name);
        this.name=name;
        this.fork=fork;
    }

    public void run(){
        while(true){
            thinking();
            fork.takeFork();
            eating();
            fork.putFork();
        }

    }

   
    public void eating(){
        System.out.println("I am Eating:"+name);
        try {
            sleep(1000);//模擬吃飯,占用一段時間資源
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

   
    public void thinking(){
        System.out.println("I am Thinking:"+name);
        try {
            sleep(1000);//模擬思考
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

class Fork{
    /*5只筷子,初始為都未被用*/
    private boolean[] used={false,false,false,false,false,false};

    /*只有當左右手的筷子都未被使用時,才允許獲取筷子,且必須同時獲取左右手筷子*/
    public synchronized void takeFork(){
        String name = Thread.currentThread().getName();
        int i = Integer.parseInt(name);
        while(used[i]||used[(i+1)%5]){
            try {
                wait();//如果左右手有一只正被使用,等待
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        used[i ]= true;
        used[(i+1)%5]=true;
    }

    /*必須同時釋放左右手的筷子*/
    public synchronized void putFork(){
        String name = Thread.currentThread().getName();
        int i = Integer.parseInt(name);

        used[i ]= false;
        used[(i+1)%5]=false;
        notifyAll();//喚醒其他線程
    }
}

//測試
public class ThreadTest {

    public static void main(String []args){
        Fork fork = new Fork();
        new Philosopher("0",fork).start();
        new Philosopher("1",fork).start();
        new Philosopher("2",fork).start();
        new Philosopher("3",fork).start();
        new Philosopher("4",fork).start();
    }
}

運行結果:

復制代碼 代碼如下:

I am Thinking:0
I am Thinking:2
I am Thinking:3
I am Thinking:1
I am Thinking:4
I am Eating:0
I am Eating:2
I am Thinking:0
I am Eating:4
I am Thinking:2
I am Eating:1
I am Thinking:4
I am Eating:3
I am Thinking:1
I am Eating:0
I am Thinking:3
I am Eating:2
I am Thinking:0
I am Eating:4
I am Thinking:2

分析:上述解決方案解決了死鎖問題??梢钥吹阶疃嘀荒苡袃蓷l相鄰的eating結果,因為每個時刻最多能夠滿足兩個人同時進餐,且兩人座位不相鄰。

相關文章

  • Spring Boot集成Swagger接口分類與各元素排序問題

    Spring Boot集成Swagger接口分類與各元素排序問題

    這篇文章主要介紹了Spring Boot集成Swagger接口分類與各元素排序問題,首先我們需要對Swagger中的接口也就是以Controller 層作為第一級梯度進行組織的,Controller在我們實際開發(fā)中,與其他具體接口之間是存在一對多的關系,本文給大家介紹的非常詳細,需要的朋友參考下吧
    2023-10-10
  • JavaSE API實現(xiàn)生成隨機數(shù)的2種方法(Random類和Math類的Random方法)

    JavaSE API實現(xiàn)生成隨機數(shù)的2種方法(Random類和Math類的Random方法)

    本文主要介紹了JavaSE API實現(xiàn)生成隨機數(shù)的2種方法,主要包括Random類和Math類的random方法都可以用來生成隨機數(shù),具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Spring MVC中自帶的跨域問題解決方法

    Spring MVC中自帶的跨域問題解決方法

    最近做一個微信小項目遇到一個跨域問題,就是我的前端和后端是放在不同的服務器上的,然后使用opst請求的時候報錯,所以通過查找相關的資料終于解決了,下面這篇文章主要給大家介紹了關于Spring MVC中自帶的跨域問題解決方法的相關資料,需要的朋友可以參考下。
    2017-09-09
  • MyBatis源碼解析之Transaction事務模塊

    MyBatis源碼解析之Transaction事務模塊

    這篇文章主要介紹了MyBatis源碼解析之Transaction事務模塊,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Spring?Retry?實現(xiàn)樂觀鎖重試實踐記錄

    Spring?Retry?實現(xiàn)樂觀鎖重試實踐記錄

    本文介紹了在秒殺商品SKU表中使用樂觀鎖和MybatisPlus配置樂觀鎖的方法,并分析了測試環(huán)境和生產(chǎn)環(huán)境的隔離級別對樂觀鎖的影響,通過簡單驗證,展示了在可重復讀和讀已提交隔離級別下的不同行為,感興趣的朋友一起看看吧
    2025-03-03
  • Java并發(fā)之CAS原理詳解

    Java并發(fā)之CAS原理詳解

    這篇文章主要為大家詳細介紹了Java的CAS原理,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • MyEclipse如何將項目的開發(fā)環(huán)境與服務器的JDK 版本保持一致

    MyEclipse如何將項目的開發(fā)環(huán)境與服務器的JDK 版本保持一致

    我們使用MyEclipse開發(fā)Java項目開發(fā)中,偶爾會遇到因項目開發(fā)環(huán)境不協(xié)調,導致這樣那樣的問題,在這里以把所有環(huán)境調整為JDK1.6 為例,給大家詳細介紹MyEclipse如何將項目的開發(fā)環(huán)境與服務器的JDK 版本保持一致,需要的朋友參考下吧
    2024-04-04
  • 詳解java安全編碼指南之可見性和原子性

    詳解java安全編碼指南之可見性和原子性

    java類中會定義很多變量,有類變量也有實例變量,這些變量在訪問的過程中,會遇到一些可見性和原子性的問題。這里我們來詳細了解一下怎么避免這些問題。
    2021-06-06
  • 基于Java實現(xiàn)簡單的郵件群發(fā)功能

    基于Java實現(xiàn)簡單的郵件群發(fā)功能

    這篇文章主要為大家詳細介紹了如何利用Java語言編寫一個簡單的工具類,可以實現(xiàn)郵件群發(fā)功能。文中的示例代碼講解詳細,需要的可以參考一下
    2022-05-05
  • java input 調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法

    java input 調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法

    今天小編就為大家分享一篇java input 實現(xiàn)調用手機相機和本地照片上傳圖片到服務器然后壓縮的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08

最新評論

象州县| 克东县| 广东省| 青川县| 高台县| 石城县| 德令哈市| 湖州市| 三穗县| 日照市| 册亨县| 陆河县| 荥经县| 天津市| 阳谷县| 大埔县| 枣强县| 彭阳县| 曲水县| 驻马店市| 鄂州市| 德州市| 仙居县| 临江市| 繁昌县| 永善县| 德保县| 辽宁省| 永宁县| 北宁市| 南澳县| 尉氏县| 微博| 丹巴县| 常山县| 凤台县| 凌云县| 区。| 太谷县| 柘荣县| 太仆寺旗|