Я пытаюсь реализовать "Философы ужина" с помощью API обработки. Я структурировал свой код в разные классы, Philosopher и Monitor для обработки потоков (я использовал wait () и notify ()). Еда , Вилка и Окно для работы с графикой.
Мой код следующий:
Класс монитора
public class Monitor implements MonitorInterface {
Philosopher[] p;
public Monitor(Philosopher[] p) {
this.p = p;
}
@Override
public synchronized void test_to_eat(int philosopher_position) {
if (p[philosopher_position].status == PhilosopherStatus.STARVING
&& p[(philosopher_position + 1) % p.length].status != PhilosopherStatus.EATING
&& p[(philosopher_position - 1 + p.length) % p.length].status != PhilosopherStatus.EATING) {
p[philosopher_position].status = PhilosopherStatus.EATING;
notify();
}
}
@Override
public synchronized void take_fork(int philosopher_position) {
p[philosopher_position].status = PhilosopherStatus.STARVING;
test_to_eat(philosopher_position);
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public synchronized void put_fork(int philosopher_position) {
p[philosopher_position].status = PhilosopherStatus.THINKING;
test_to_eat((philosopher_position + 1) % p.length);
test_to_eat((philosopher_position - 1 + p.length) % p.length);
}
@Override
public void eat() {
System.out.println(Thread.currentThread().getName() + " ...EATING...");
try {
Thread.sleep((int) (1000 * Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void think() {
System.out.println(Thread.currentThread().getName() + " ...THINKING...");
try {
Thread.sleep((int) (1000 * Math.random()));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Философский класс
import processing.core.PApplet;
import processing.core.PShape;
public class Philosopher extends Thread {
private String name;
PhilosopherStatus status;
private Monitor m;
private int position;
private float pos_x, pos_y;
PApplet p;
public Philosopher(PApplet p, int position, String name, Monitor m, float pos_x, float pos_y) {
this.position = position;
this.name = name;
this.m = m;
this.pos_x = pos_x;
this.pos_y = pos_y;
this.p = p;
this.status = PhilosopherStatus.THINKING;
this.start();
}
public void show() {
if (this.status.equals(PhilosopherStatus.THINKING)) {
p.fill(20,28,255);
} else if (this.status.equals(PhilosopherStatus.STARVING)) {
p.fill(255,8,57);
} else if (this.status.equals(PhilosopherStatus.EATING)) {
p.fill(23,255,38);
} else {
p.fill(0);
}
p.rect(pos_x, pos_y, 45, 45);
p.fill(0);
p.textSize(15);
p.textAlign(p.LEFT, p.LEFT); // centre le texte horizontalement et verticalement
p.text(this.name, pos_x, pos_y + 50, 100, 200);
}
@Override
public void run() {
//while (true) {
m.think();
m.test_to_eat(this.position);
m.take_fork(this.position);
m.eat();
m.put_fork(this.position);
//}
}
public String getNamee() {
return name;
}
public void setNamee(String name) {
this.name = name;
}
public PhilosopherStatus getStatus() {
return status;
}
public void setStatus(PhilosopherStatus status) {
this.status = status;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public float getPos_x() {
return pos_x;
}
public void setPos_x(float pos_x) {
this.pos_x = pos_x;
}
public float getPos_y() {
return pos_y;
}
public void setPos_y(float pos_y) {
this.pos_y = pos_y;
}
}
Класс окна
import processing.core.PApplet;
import processing.core.PShape;
public class Window extends PApplet{
@Override
public void settings() {
size(800, 600);
noLoop();
}
public void setup() {
super.setup();
}
public void drawPhilosopher(Philosopher p) {
PhilosopherStatus status = p.getStatus();
float pos_x = p.getPos_x();
float pos_y = p.getPos_y();
String name = p.getNamee();
if (status == PhilosopherStatus.THINKING)
fill(20,28,255);
else if (status == PhilosopherStatus.STARVING)
fill(255,8,57);
else if (status == PhilosopherStatus.EATING)
fill(23,255,38);
else
fill(0);
rect(pos_x, pos_y, 45, 45);
fill(0);
textSize(15);
textAlign(LEFT, LEFT);
text(name, pos_x, pos_y + 50, 100, 200);
}
@Override
public void draw() {
try {
background(255);
// Loading shapes
PShape pasta = loadShape("./img/pasta.svg");
PShape fork = loadShape("./img/fork.svg");
// drawing shapes
Food food = new Food(pasta, this);
Fork f1 = new Fork(this, fork, 270, 360, 0, false);
f1.show();
Fork f2 = new Fork(this, fork, 340, 210, (float) 1.5, true);
f2.show();
Fork f3 = new Fork(this, fork, 560, 260, (float) 1.8, true);
f3.show();
Fork f4 = new Fork(this, fork, 545, 405, (float) 1.17, false);
f4.show();
Fork f5 = new Fork(this, fork, width/2 - 10, 450, 1, true);
f5.show();
// Drawing Philosophers
Philosopher[] p = new Philosopher[5];
Monitor m = new Monitor(p);
p[0] = new Philosopher(this, 0, "A", m, width/2 - 25, 150);
p[0].setName("A");
p[1] = new Philosopher(this, 1, "B", m, width/2 + 130, 250);
p[1].setName("B");
p[2] = new Philosopher(this, 2, "C", m, width/2 + 70, 390);
p[2].setName("C");
p[3] = new Philosopher(this, 3, "D", m, width/2 - 120, 390);
p[3].setName("D");
p[4] = new Philosopher(this, 4, "E", m, width/2 - 170, 250);
p[4].setName("E");
for (Philosopher philo: p) {
philo.show();
}
delay(3000);
for (Philosopher philo: p) {
philo.run();
}
try {
p[0].join();
p[1].join();
p[2].join();
p[3].join();
p[4].join();
} catch (InterruptedException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Основной класс
import processing.core.PApplet;
public class Main extends PApplet {
public static void main(String[] args) {
Window w = new Window();
PApplet.main(Window.class.getName());
}
}
Я представляю своих философов как квадраты, и поведение, которое я Я ожидаю, что мой квадрат будет менять свой цвет каждый раз, когда меняется состояние философа.
Но все, что я получаю, это пустой экран!
Снимок экрана окна вывода Обратите внимание, что при использовании консоли для проверки моего кода, он работает правильно, без каких-либо ошибок или странного поведения
Спасибо Вы заранее.