Не понял тему многопоточности
Дебаггера нету.
По задумке только 2-3 потока из пяти, после запуска метода start() для них, должны выполнить методы takeLeftFork(), takeRightFork(), eat(), dropForks() и только после выполнения всех этих методов освободить объекты forks для других потоков. Но судя по выводу в консоль выполняется только метод takeLeftFork(), а после этого сразу управление передается другим потокам. Другие методы ни у каких потоков вообще не выполняются. Что я сделал не так?
public class Philosopher implements Runnable {
private Fork leftFork;
private Fork rightFork;
public Philosopher(){}
public Philosopher(Fork lf, Fork rf){
leftFork = lf;
rightFork = rf;
}
public static void main(String[] args) {
Fork f1 = new Fork();
Fork f2 = new Fork();
Fork f3 = new Fork();
Fork f4 = new Fork();
Fork f5 = new Fork();
Philosopher p1 = new Philosopher(f5, f1);
Philosopher p2 = new Philosopher(f1, f2);
Philosopher p3 = new Philosopher(f2, f3);
Philosopher p4 = new Philosopher(f3, f4);
Philosopher p5 = new Philosopher(f4, f5);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(p3);
Thread t4 = new Thread(p4);
Thread t5 = new Thread(p5);
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
public void run() {
this.takeLeftFork();
}
public void takeLeftFork() {
synchronized (this.leftFork) {
System.out.println(this + "takes left fork");
try { Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(e.getMessage());
}
this.takeRightFork();
}
}
public void takeRightFork() {
synchronized (this.rightFork) {
System.out.println(this + "takes right fork");
this.eat();
}
}
public void eat(){
System.out.println(this + "is eating");
this.dropForks();
}
public void dropForks(){
Thread.yield();
}
public void think(){
System.out.println(this + "is thinking");
}
}
class Fork{
public Fork(){}
}