КОД под текстом
Объясните плз правильно ли я понимаю ход работы программы? Как мне показалось, разобраться с этой задачей - ключ к успеху в многопоточности.
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;
}
}
}
}
ak
22 уровень
Объясните балбесу дубль2
Обсуждается
Комментарии (2)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Sergei Butchak
16 июня 2020, 22:00
и тут ВОПРОС: зачем в цикле мы меняем значение переменной на TRUE в методе run класа Plane? isAlreadyTakenOff = true;
Сам цикл работает по значению этого поля. Меняем его для того, чтобы выйти из цикла.
+1
ak
17 июня 2020, 07:47
Спасибочки
0