java - "Dining Philosophers"在Java中使用Future

标签 java concurrency future

我正在尝试使用 Java 中的 Future 来解决哲学家问题。

 public class Philo implements Callable<PhiloStatus> {

    private PhiloStatus status;
    private Philo leftPhilo;
    private Philo rightPhilo;

    private String name;

    public Philo(String name) {
        status = PhiloStatus.THINKING;

        this.name =name;
    }



    public void setLeftPhilo(Philo leftPhilo) {
        this.leftPhilo = leftPhilo;
    }

    enter code here

    public void setRightPhilo(Philo rightPhilo) {
        this.rightPhilo = rightPhilo;
    }



    @Override
    public PhiloStatus call() throws Exception {

        if (leftPhilo.getStatus() == PhiloStatus.THINKING
                && rightPhilo.getStatus() == PhiloStatus.THINKING) {

            this.status =PhiloStatus.DINING;
            System.out.println("Dininig "+this);
            return PhiloStatus.DINING;

        }

        this.status =PhiloStatus.THINKING;
        System.out.println("Thinking "+this);
        return PhiloStatus.THINKING;
    }

    public PhiloStatus getStatus() {

        return status;

    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return name;
    }

}

程序的起点

public class Start {

    /**
     * @param args
     */
    public static void main(String[] args) {


        ExecutorService executorService = Executors.newFixedThreadPool(5);
        Philo[] philosophers = new Philo[5];


        for (int i = 0; i < 5; ++i)
          philosophers[i] = new Philo(""+i);
        for (int i = 0; i < 5; ++i) {
          philosophers[i].setLeftPhilo(philosophers[(i + 4) % 5]);
          philosophers[i].setRightPhilo(philosophers[(i + 1) % 5]);

          executorService.submit( philosophers[i]);

        }



    }

}

但是似乎一旦 Callable 完成执行,它就会返回相同的结果。

我现在怀疑使用Future可能无法解决这个问题?

有人可以解释一下吗?

最佳答案

class Philo implements Runnable{

   @Override
   public void run(){
       while(true){

           if(Thread.interrupted()){
               break;
           }

           //dining logic
       }

   }
}

解决方案可以是一个循环,一直执行到有人打断Philosopher为止。

关于java - "Dining Philosophers"在Java中使用Future,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20215864/

相关文章:

mysql - 了解 Spring 中的事务和数据库级别的事务吗?

python - 为什么我不能在 asyncio 事件循环中使用并发.futures?

Android:从回调中获取结果(联网KOUSH ION)

java - Java LinkedBlockingQueue 中的非 volatile 头尾引用

java - 如何拦截和处理装饰器类中的 Future?

java - 如何使用 javaagent 访问工具方法的变量?

java - 为什么在类中声明数组列表时不导入 java.util

如果没有下载,Java android检查是否安装了Acrobat Reader

java - 加载事先不知道包的 Java 类

c++ - 并发无锁单链表 C++ : does concurrency affect the interface? 迭代器仍然有意义吗?