Я пытаюсь решить проблему Философа, используя Future на Java.«Обеденные философы» с использованием Fututre в Java
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 завершается выполнение, она возвращает тот же результат.
Теперь я сомневаюсь, что решить эту проблему с будущим возможно не удастся?
Не мог бы кто-нибудь пролить свет на это.
Я думаю, что ошибка в той части, где вы действительно используете Callable. Можете ли вы отправить эту часть кода? – TwoThe
Жизненный цикл вызываемого пользователя до тех пор, пока он не вернет результат, тогда как жизненный цикл алгоритма намного больше. Философ не должен заканчивать исполнение, возвращая статус. –
@TwoThe добавил код. – nish1013