2011-12-20 66 views
2

私は食堂の哲学者の問題をJavaで実装していますが、何かがうまくいかず、デッドロックにつながります... 誰かがデッドロックにつながるのはなぜですか?Javaで食事をする哲学者がデッドロックにつながる

誰もが食べて飢えを防ぐために、哲学者は常にダイニングルームでN-1にする必要があります。

メインクラス:

public class DiningPhilosophers { 

public static int N = 5; 
//Philosopher philosopher[]; 
//Chopsticks chopsticks; 
//DiningRoom diningroom; 


public static void main(String[] args) { 
    Philosopher[] philosopher = new Philosopher[N]; 
    Chopsticks chopsticks = new Chopsticks(N); 
    DiningRoom diningroom = new DiningRoom(N); 

    for(int i = 0;i<N;i++) 
     philosopher[i] = new Philosopher(i,10,20,30,100,chopsticks,diningroom); 

    for(int i = 0;i<N;i++) 
     philosopher[i].start(); 


} 

} 

箸クラス:

class Chopsticks{ 


private int numOfChops[]; 
private int N; 

public Chopsticks(int N){ 
    this.N = N; 
    numOfChops = new int[N]; 
    for(int i = 0;i<N;i++) 
     numOfChops[i] = 2; 

} 

public synchronized void take(int philosopher){ 
    while(numOfChops[philosopher] != 2){ 
     try{ 
      wait(); 
     }catch(InterruptedException e){ 

     } 
     //System.out.println("philosopher "+philosopher+"taking"); 
     numOfChops[(philosopher+1)%N]--; 
     numOfChops[(Math.abs(philosopher-1))%N]--; 
    } 
} 

public synchronized void release(int philosopher){ 
    //System.out.println("philosopher "+philosopher+"releasing"); 
    numOfChops[(philosopher+1)%N]++; 
    numOfChops[(Math.abs(philosopher-1))%N]++; 
    notifyAll(); 
} 
} 

ダイニングルームクラス:

class DiningRoom{ 
private int vacancy; 
private int n; 

public DiningRoom(int N){ 
    this.n = N; 
    vacancy = n -1; 

} 

public synchronized void enter(){ 
    while(vacancy == 0){ 
     try{ 
      wait(); 
     }catch(InterruptedException e){    
     }   
     vacancy--;   
    } 
} 

public synchronized void exit(){ 

    vacancy++; 
    notify(); 

} 
} 

哲学者クラス:

class Philosopher extends Thread{ 

int i; 
int minThinkTime,maxThinkTime,minEatTime,maxEatTime; 
private Chopsticks c; 
private DiningRoom d; 

public Philosopher(int index,int minThinkTime,int maxThinkTime,int minEatTime,int maxEatTime, Chopsticks chopsticks, DiningRoom diningroom){ 
    this.i = index; 
    this.minThinkTime = minThinkTime; 
    this.maxThinkTime = maxThinkTime; 
    this.minEatTime = minEatTime; 
    this.maxEatTime = maxEatTime; 
    this.c = chopsticks; 
    this.d = diningroom; 
} 

public void think(){ 
    try{ 
     System.out.println(i+" Philosopher is thinking!"); 
     Thread.sleep((int)(Math.random()*(maxThinkTime - minThinkTime))+minThinkTime); 

    }catch(InterruptedException e){ 

    } 
} 

public void eat(){ 
    try{ 
     System.out.println(i+" Philosopher is eating!"); 
     Thread.sleep((int)(Math.random()*(maxEatTime - minEatTime))+minEatTime); 

    }catch(InterruptedException e){ 

    } 
} 
public void run() { 
    while (true) { 
     think(); 
     System.out.println("pholosopher "+i+"entering"); 
     d.enter(); 
     c.take(i); 
     eat(); 
     c.release(i); 
     d.exit(); 
     System.out.println("pholosopher "+i+"exiting"); 
    } 
} 


} 
あなたはループの外箸カウンタを減少させるラインを移動する必要があります

public synchronized void take(int philosopher)

:で

+0

答えはあなたのデッドロックをおそらく修正しましたが、私はと心配です'(Math.abs(哲学者-1))%N'のあなたの使用。これはNにリングを実装しません。 'N - 1'に評価するには' 0 - 1 'が必要なので、適切に呼び出すには '(哲学者-1 + N)%N'を使う必要があります。 – OldCurmudgeon

+0

また、 'Diningroom.exit'はたぶん' notify'の代わりに 'Chopsticks.release'のように' notifyall'を使うべきでしょう。または、おそらく...私は今確信していません。 ( – OldCurmudgeon

答えて

1

+0

あなたは正しいです!私はそれを見ませんでした。ありがとう! – stelios

+0

@steliosあなたはDiningRoomで同じミスをしたようです#enter() –

+0

@Mark Rotteveelあなたは正しいです! – stelios

2

あなたのChopsticks.take()は間違っていると思います。今、哲学者が最初に箸をとると、何もしません。その後、彼が近隣の人のためにnumOfChopsを増加させ、2に決して等しくないので、彼らはすべてtake()でブロックします。それはshoudどこ

あなたが取るの終わりに近づきすぎしばらくから中括弧を入れている()、これは次のようになります。以下

public synchronized void take(int philosopher){ 
    while(numOfChops[philosopher] != 2){ 
     try{ 
      wait(); 
     }catch(InterruptedException e){ 

     } 
    } 
    //System.out.println("philosopher "+philosopher+"taking"); 
    numOfChops[(philosopher+1)%N]--; 
    numOfChops[(Math.abs(philosopher-1))%N]--; 

} 
関連する問題