程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 哲學家就餐成績中的JAVA多線程進修

哲學家就餐成績中的JAVA多線程進修

編輯:關於JAVA

哲學家就餐成績中的JAVA多線程進修。本站提示廣大學習愛好者:(哲學家就餐成績中的JAVA多線程進修)文章只能為提供參考,不一定能成為您想要的結果。以下是哲學家就餐成績中的JAVA多線程進修正文


成績描寫:一圓桌前坐著5位哲學家,兩小我中央有一只筷子,桌子中心有面條。哲學家思慮成績,當餓了的時刻拿起閣下兩只筷子吃飯,必需拿到兩只筷子能力吃飯。上述成績會發生逝世鎖的情形,當5個哲學家都拿起本身右手邊的筷子,預備拿左手邊的筷子時發生逝世鎖景象。

處理方法:

1、添加一個辦事生,只要當經由辦事生贊成以後能力拿筷子,辦事生擔任防止逝世鎖產生。

2、每一個哲學家必需肯定本身閣下手的筷子都可用的時刻,能力同時拿起兩只筷子進餐,吃完以後同時放下兩只筷子。

3、劃定每一個哲學家拿筷子時必需拿序號小的那只,如許最初一名未拿到筷子的哲學家只剩下序號年夜的那只筷子,不克不及拿起,剩下的這只筷子便可以被其他哲學家應用,防止了逝世鎖。這類情形不克不及很好的應用資本。 

代碼完成:完成第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

剖析:上述處理計劃處理了逝世鎖成績。可以看到最多只能有兩條相鄰的eating成果,由於每一個時辰最多可以或許知足兩小我同時進餐,且兩人坐位不相鄰。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved