Ребят, если можно, объясните пожалуйста как пятилетнему по моим комментариям на коде. Некоторые моменты я специально удалил, дабы не выкладывать готовое решение, так как задание решил.
public class Solution {
    public static volatile Runway RUNWAY = new Runway();   //1 взлетная полоса
    public static Runway SAD = new Runway();
    public static void main(String[] args) throws InterruptedException {
        Plane plane1 = new Plane("Самолет #1"); // Вот тут мы создаем потоки, называем их именами,
        Plane plane2 = new Plane("Самолет #2"); // что лежат в аргументах, а сами объекты Plane
        Plane plane3 = new Plane("Самолет #3"); // у нас выступают тасками, так?

    }

    private static void waiting() {
        //add your code here - добавь код тут     // Здесь мы выставим задержку

    }

    private static void takingOff() {
        //fix this method - исправь этот метод    // Здесь тоже задержка
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
        }
    }

    public static class Plane extends Thread {   // Конструктор, который мы можем трактовать так:
        public Plane(String name) {              // Thread t = new Thread(new Plane);
            super(name);                         // t.start();
            start();
        }

        public void run() {                                      // Вот тут прям начинается пиздося...
            boolean isAlreadyTakenOff = false;                   // Понятно, флажок
            while (!isAlreadyTakenOff) {                         // Входим в цикл, в котором следующая строка наводит ужас
                if (RUNWAY.trySetTakingOffPlane(this)) {      // Не понимаю как понять это выражение
                    System.out.println(getName() + " взлетает");
                    takingOff();//взлетает
                    System.out.println(getName() + " уже в небе");
                    isAlreadyTakenOff = true;
                    RUNWAY.setTakingOffPlane(null);
                } else if (!this.equals(RUNWAY.getTakingOffPlane())) {  //и опять этот ужас
                    System.out.println(getName() + " ожидает");
                    waiting(); //ожидает
                }
            }
        }
    }

    public static class Runway { //взлетная полоса
        private Thread t;

        public Thread getTakingOffPlane() {     // Не понимаю что мы вернем из этого геттера.
            return t;                           // Просто пустую ссылочную переменную Thread t?
        }                                       // Аргумента то нет никакого

        public void setTakingOffPlane(Thread t) {    // Тут вроде обычный сеттер
            synchronized (this) {
                this.t = t;
            }
        }

        public boolean trySetTakingOffPlane(Thread t) {   // Вот собственно и непонятная штука.
            synchronized (this) {      // Синхронизация, это понятно.
                if (this.t == null) {  // Если t == null, имеется ввиду, что никто не
                    this.t = t;        // воспользовался сеттером и соответственно он null?
                    return true;
                }
                return false;
            }
        }
    }
Что означает выражение RUNWAY.trySetTakingOffPlane(this)? Точнее несколько вопросов: Почему мы обращаемся к методу класса через его объект, а не через имя самого класса?(Runway.trySet) Потому что класс статический? Что передастся методу trySetTakingOffPlane в качестве (this)? Текущий поток или что у нас тут this? В остальном по коду я правильно все понимаю? Прошу прощения, если что-то коряво или не совсем понятно написал, старался как мог, уже голова пухнет, не могу все никак уложить в голове. И за поток вопросов тоже прошу прощения)