Ребят, если можно, объясните пожалуйста как пятилетнему по моим комментариям на коде. Некоторые моменты я специально удалил, дабы не выкладывать готовое решение, так как задание решил.
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? В остальном по коду я правильно все понимаю? Прошу прощения, если что-то коряво или не совсем понятно написал, старался как мог, уже голова пухнет, не могу все никак уложить в голове. И за поток вопросов тоже прошу прощения)