//All things whatever the Father has are mine; therefore I said that he takes of mine, and will declare it to you. (John 16:15) 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() { try { //add your code here - добавь код тут Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } 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; } } } } /* Аэропорт 1. Разберись, что делает программа. 2. Исправь метод takingOff(взлет) — сейчас он работает оооочень долго. Взлет должен занимать 100 миллисекунд. 3. Реализуй метод waiting по аналогии с методом takingOff. Время ожидания не должно превышать время взлета. Требования: 1. Метод takingOff должен работать примерно 100 мс. 2. Метод waiting должен работать примерно 100 мс. 3. В методе main должно создаваться 3 самолета. 4. В классе Solution должен быть вложенный класс Plane (самолет). 5. В классе Solution должен быть вложенный класс Runway (взлетная полоса). 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 - добавь код тут } private static void takingOff() { //fix this method - исправь этот метод try { Thread.sleep(10000); } 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; } } } } */