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

是的,很好,谢谢。 –