Не понял тему многопоточности

Дебаггера нету. По задумке только 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(){}         
     }

Ответы (0 шт):