gpt4 book ai didi

java - Dining Philosophers 代码中发生的饥饿

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:08:42 26 4
gpt4 key购买 nike

这是我对哲学家晚餐并发问题的实现。我只为两个线程工作,其余线程遭受饥饿,从字面上看 ;) 如果您能找到原因,我将不胜感激。

这是输出:

Philosopher 2 is eating
Philosopher 0 is eating
Philosopher 2 is eating
Philosopher 0 is eating
Philosopher 2 is eating
Philosopher 0 is eating
Philosopher 2 is eating
Philosopher 0 is eating
Philosopher 2 is eating
Philosopher 2 is eating
Philosopher 0 is eating
Philosopher 2 is eating
Philosopher 0 is eating

代码如下:

public class PhilosophersDinner {

public static void main(String[] args) {
Chopstick2[] chopsticks = new Chopstick2[5];
Philosopher [] philosophers = new Philosopher[5];

for (int i = 0; i < 5; i++) {
Chopstick2 stick = new Chopstick2();
chopsticks[i] = stick;
}

for (int i = 0; i < 5; i++) {
Philosopher philo = new Philosopher(chopsticks[i] , chopsticks[(i+1)%5], i+"");
philosophers[i] = philo;
}

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

}

class Philosopher implements Runnable {

private final Chopstick2 left;
private final Chopstick2 right;
private final String id;

public Philosopher(Chopstick2 l, Chopstick2 r, String id){
this.left = l;
this.right = r;
this.id = id;
}

public void eat(){
if (left.pickUp()) {
if (right.pickUp()) {
chew();
putDown();
} else left.putDown();
}
}


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

public void chew(){
try {
System.out.println("Philosopher "+id+" is eating");
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
// release lock here?
}
}

public void putDown(){
left.putDown();
right.putDown();
}

}

class Chopstick2 {
private volatile boolean taken = false;

public synchronized boolean pickUp(){
if (!taken) {
taken = true;
return true;
}
else return false;
}

public synchronized void putDown(){
taken = false;
}
}

最佳答案

问题是前两个拿到筷子的哲学家花了半秒的时间吃饭,而在这段时间里,其他三个用餐者尝试吃饭,直到他们放弃并退出。

一个解决方案是让所有哲学家吃指定的时间,而不是尝试吃特定的次数。

    for (long i = System.currentTimeMillis()+10000; i > System.currentTimeMillis(); ) {
eat();
}

关于java - Dining Philosophers 代码中发生的饥饿,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com