当前位置: 首页 > 知识库问答 >
问题:

java替代解决方案

澹台展鹏
2023-03-14

我在一本书中发现了一个“用餐哲学家问题”的替代解决方案,用Java编写:

public class Philosopher extends Thread {
private final int maxPause = 100;
private int bites = 10;

private Chopstick lower;
private Chopstick higher;
private int index;
public Philosopher(int i, Chopstick left, Chopstick right) {
    index = i;
    if (left.getNumber() < right.getNumber()) {
        this.lower = left;
        this.higher = right;
    } else {
        this.lower = right;
        this.higher = left;
    }
}

public void eat() {
    System.out.println("Philosopher " + index + ": start eating");
    pickUp();
    chew();
    putDown();
    System.out.println("Philosopher " + index + ": done eating");
}

public void pickUp() {
    pause();
    lower.pickUp();
    pause();
    higher.pickUp();
    pause();
}

public void chew() {
    System.out.println("Philosopher " + index + ": eating");
    pause();
}

public void pause() {
        try {
        int pause = AssortedMethods.randomIntInRange(0, maxPause);
        Thread.sleep(pause);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
   }

public void putDown() {
    higher.putDown();
    lower.putDown();
}

public void run() {
    for (int i = 0; i < bites; i++) {
        eat();
    }
}
}

public class Chopstick {
private Lock lock;
private int number;

public Chopstick(int n) {
    lock = new ReentrantLock();
    this.number = n;
}

public void pickUp() {
    lock.lock();
}

public void putDown() {
    lock.unlock();  
}

public int getNumber() {
    return number;
}
}

解决方案的文本是:

或者,我们可以给筷子贴上从e到N-1的标签。每个哲学家都试图先拿起编号较低的筷子。这基本上意味着每个哲学家都会先选择左边的筷子,再选择右边的筷子(假设你是这样给它贴标签的),除了最后一位哲学家会选择相反的方式。有了这个解决方案,哲学家不可能拿着大筷子而不拿着小筷子。这就阻止了循环的能力,因为循环意味着较高的筷子“指向”较低的筷子。

但我不清楚。有人能帮我举个例子吗?

谢谢

----编辑-----

主要类别:

 public class Question {
public static int size = 3;

public static int leftOf(int i) {
    return i;
}

public static int rightOf(int i) {
    return (i + 1) % size;
}

public static void main(String[] args) {        
    Chopstick[] chopsticks = new Chopstick[size + 1];
    for (int i = 0; i < size + 1; i++) {
        chopsticks[i] = new Chopstick(i);
    }

    Philosopher[] philosophers = new Philosopher[size];
    for (int i = 0; i < size; i++) {
        Chopstick left = chopsticks[leftOf(i)];
        Chopstick right = chopsticks[rightOf(i)];
        philosophers[i] = new Philosopher(i, left, right);
    }

    for (int i = 0; i < size; i++) {
        philosophers[i].start();
    }       
}

}

共有1个答案

宰父正真
2023-03-14

让我们有三个哲学家——p1、p2、p3和三根筷子c1、c2、c3(筷子的索引等于<代码>数字

然后创建p1(c1,c2)、p2(c2,c3)、p3(c1,c3)

最坏情况:

  • p1获取c1上的锁
  • 同时p2获得对c2的锁定-
 类似资料:
  • 从codingBat解决这个问题 给定一个字符串,返回字符串中最大“块”的长度。块是相同的相邻字符的运行。 我试图解决它使用一个为循环如下: 它胜过了所有的案子,除了一个。有人能用一个for循环显示解决方案吗? 很抱歉这么晚才提到,但您不能使用正则表达式或集合框架中的任何东西。

  • 我知道苹果发布了基于蓝牙4.0协议的iBeacon。 在任何蓝牙设备中,如果我们使用以下代码对设备进行编码: 表示呈现此蓝牙设备是iBeacon蓝牙设备。 我的问题是,如果我定义了自己的协议,这意味着我会改变它 是否有一种可能性,我可以通过iphone识别我自己定义的蓝牙设备,而无需在iphone上添加识别设备。 苹果是否支持定制ibeacon? 编辑根据davidgyoung所说,我对stack

  • 我写了一个相当基本的js函数,它以编程方式自动将iPhone键盘完美地对准每一个聚焦的输入字段(如果你喜欢,可以随意使用它!)。对齐主要由window.scroll处理——这是一种标准方法,适用于任何浏览器视图,UIWebView除外,因此是phonegap/cordova(2.1)。所以我需要一个变通方法。 我的工作代码: 工作在一切,但UIWebView,这是。正如我上面提到的,除了windo

  • java.lang.IllegalArgumentException:无法将io.appium.java_client.ios.ioselement字段screens.loginscreen.signinemail设置为org.openqa.selenium.remote.remoteWebelement$$enhancerbycglib$$62bef779 此外,我不能将WebElements转

  • 问题内容: 我过去曾使用ServiceWrapper几次,但是,对于商业产品,双重许可有些复杂(通常需要付费)。是否存在具有类似功能的完全FOSS替代产品? 问题答案: 尽管我尚未完成评估,但YAJSW似乎是最好的选择。

  • 问题内容: 关于部署Node.js应用程序,我看过很多教程,展示了它与Nginx并排部署的方法,或多或少有一些漂亮的技巧可以使两者一起工作(令人讨厌的东西,例如Nginx不支持WebSockets) 。这对我来说似乎有点复杂… 为什么每个人都进行这种设置?有Node.js时部署Nginx是否有任何优势?您不能使用Node.js提供静态文件吗? 我已经在Django中编写了许多应用程序,并且文档说您