java - 餐饮哲学家实现

标签 java

<分区>

我只是想知道这是否是为了解决 java 中的哲学家就餐问题?

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class MainClass {

public static void main(String[] args) {
    Lock forks[] = new ReentrantLock[5];

    for(int i = 0; i<5; i++){
        forks[i] = new ReentrantLock(); 
    }

    Thread p1 = new Thread(new Philosopher(forks[4], forks[0], "first"));
    Thread p2 = new Thread(new Philosopher(forks[0], forks[1], "second"));
    Thread p3 = new Thread(new Philosopher(forks[1], forks[2], "third"));
    Thread p4 = new Thread(new Philosopher(forks[2], forks[3], "fourth"));
    Thread p5 = new Thread(new Philosopher(forks[3], forks[4], "fifth"));

    p1.start();
    p2.start();
    p3.start();
    p4.start();
    p5.start(); 
  }
}

和我的哲学课:

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Philosopher implements Runnable {

Lock leftFork = new ReentrantLock();
Lock rightFork = new ReentrantLock();
String name; 

public Philosopher(Lock leftFork, Lock rightFork, String name) {
    this.leftFork = leftFork;
    this.rightFork = rightFork;
    this.name = name; 
}

@Override
public void run() {

    while(true){
    think(name);
    eat(leftFork, rightFork, name); 
    }
}

private void eat(Lock leftFork, Lock rightFork, String name){
    leftFork.lock();
    rightFork.lock(); 

    System.out.println(name + " eating...");

    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
    finally{
        leftFork.unlock();
        rightFork.unlock(); 
        System.out.println(name + " done eating...");
    }
}

private void think(String name){
    System.out.println(name + " thinking...");

    try {
        Thread.sleep(100);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}

}

感觉应该有更多的..代码。但是我已经运行了这个程序,它完成了问题要我解决的问题。任何时候只有两个哲学家在吃饭,否则他们在思考。

我有这个权利吗?

最佳答案

不,此代码无法避免死锁。

所有 5 位哲学家都有可能获得他们的左叉;然后他们将永远等待他们正确的 fork 。

为了演示这一点,在 leftFork.lock()rightFork.lock(),这应该会使它在大多数情况下失败。当前代码偶尔会在我的系统上失败,即使没有通过额外的延迟来触发它也是如此。

关于java - 餐饮哲学家实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13105628/

相关文章:

java - 如何在国际象棋游戏中使用 BuffereImage

java - 为什么枚举的构造函数不能访问静态字段?

Java RAD 组件/架构 - 对 .NET 开发人员的建议?

java - 如何在没有关联窗口的情况下使图像出现在屏幕上

java - JTextPane 和 JTextField 之间的文本选择冲突

java - 将模型添加到 java 类路径

java - 如何获取一个PreparedStatement在DB2中即将执行的完整查询?

java - 在 JAVA nio 选择器中,我应该什么时候注册 'write operation' ?

java - 在 jlabel 背景上添加 jpanel

java - 仅在方法的第一次调用时调用方法 block