2016-11-21 32 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

你必須去adlock,因爲Semaphore在Fork類中是靜態的,相當於只有一個叉可用。當你使Semaphore不是靜態的時候它是完美的(2個隨機哲學家同時運行)。

您可以觀察在JDK的工具jvisualvm中構建的線程。

+0

是的,很好,謝謝。 –