КОД под текстом Объясните плз правильно ли я понимаю ход работы программы? Как мне показалось, разобраться с этой задачей - ключ к успеху в многопоточности. 1. Создаем экземпляр класса Plane с ссылкой plane1 2. Попадаем в конструктор. делаем инициализацию аргумента name от предка Thread. Создаем первую дочернюю нить Thread plane1 = new Thread(new Plane ("Самолет #1")) 3. Запускаем нить plane1.start() 4. Проверяем какое значение имеет переменная t в методе trySetTakingOffPlane(Thread t). Если null (true) - взлетная пустая иначе false - полоса занята, брат. Т.е отправляем в этот метод нашу нить plane1 как аргумент. Если Thread t еще не был иницилизирован, т.е this.t == null, делаем инициализацию и присваиваем this.t = t (нашу нить), возвращаем true - как ответ что взлетная полоса занята. 5. Если все ок и взлетная пустая, выводим на экран имя нашего экземпляра и запускаем метод takingOff() в котором наша нить засыпает на 100мс. 6. Далее по накатанной запускается, иницилизируется следующий экземпляр. Создает вторую дочернюю нить, проверяет на свободность полосу, если занята (а она у нас занята), выводит на экран, мол я Самолет №2 и я в ожидании.. и запускает метод waiting() ву котором тоже включается sleep на 100мс. 7. Далее допустим просыпается наша первая дочерняя нить, выводит на экран радостное известие, что она уже в небе. и тут ВОПРОС: зачем в цикле мы меняем значение переменной на TRUE в методе run класа Plane? isAlreadyTakenOff = true; package com.javarush.task.task16.task1615; /* Аэропорт */ public class Solution { public static volatile Runway RUNWAY = new Runway(); //1 взлетная полоса public static void main(String[] args) throws InterruptedException { Plane plane1 = new Plane("Самолет #1"); Plane plane2 = new Plane("Самолет #2"); Plane plane3 = new Plane("Самолет #3"); } private static void waiting() { //add your code here - добавь код тут try { Thread.sleep(100); } catch (InterruptedException e) { } } private static void takingOff() { //fix this method - исправь этот метод try { Thread.sleep(100); } catch (InterruptedException e) { } } public static class Plane extends Thread { public Plane(String name) { super(name); 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; } public void setTakingOffPlane(Thread t) { synchronized (this) { this.t = t; } } public boolean trySetTakingOffPlane(Thread t) { synchronized (this) { if (this.t == null) { this.t = t; return true; } return false; } } } }