2016-11-21 102 views
1

私は、Javaセマフォを使用して食事の哲学者の問題を解決したいですが、私は立ち往生しています。最高のIDの箸は利用できるはずですが、それはいつも取られているようですが、私は理由を知らないのです。誰かが私が間違っていた場所を教えてもらえますか?セマフォを使用してJavaで食事する哲学者

フォーククラス:

class Fork { 
public static Semaphore fork = new Semaphore(1); 
public int id; 

Fork(int id) { 
    this.id = id; 
} 

public int getId() { 
    return id; 
} 

public boolean take() { 
    return fork.tryAcquire(); 
} 

public void putDown() { 
    fork.release(); 
}} 

哲学者クラス:

class Philosopher extends Thread { 

private Fork fork_low; 
private Fork fork_high; 
private String name; 

Philosopher(Fork fork_low, Fork fork_high, String name) { 
    this.fork_low = fork_low; 
    this.fork_high = fork_high; 
    this.name = name; 
} 

public void run() { 

    try { 
     sleep(1000); 
    } catch (InterruptedException ex) { 
    } 

    while (true) { 
     eat(); 
    } 
} 

private void eat(){ 
    if(fork_low.take()){ 
     if(fork_high.take()){ 
      try { 
       sleep(2000); // eating; 
      } catch (InterruptedException ex) { } 

      fork_high.putDown(); 
      fork_low.putDown(); 

     } 
     else{ 
      fork_low.putDown(); 
     } 
    } 
}} 

メイン:

public static void main(String[] args) { 
    String[] names = {"Plato", "Aristotle", "Cicero", "Confucius", "Eratosthenes"}; 
    Fork[] fork = new Fork[5]; 
    Philosopher[] philosopher = new Philosopher[5]; 

    for (int i = 0; i < fork.length; i++) { 
     fork[i] = new Fork(i); 
    } 

    for (int i = 0; i < philosopher.length; i++) { 

     if (i != philosopher.length - 1) { 
      philosopher[i] = new Philosopher(fork[i], fork[i+1], names[i]); 
      philosopher[i].start(); 
     } else { 
      philosopher[i] = new Philosopher(fork[0], fork[i], names[i]); 
      philosopher[i].start(); 
     } 
    } 
} 

答えて

2

あなたはドを持っていますセマフォーはForkクラス内で静的であるため、使用可能なフォークを1つしか持たないのと同じです。セマフォを静的にしないと(2人のランダムな哲学者が同時に動く)、これは完璧に動作します。

JDKのビルドツールjvisualvmで動作するスレッドを確認できます。

+0

うん、うまくいく、ありがとう。 –

関連する問題