Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 27

Не допустить одновременное выполнение задачи разными потоками

11.12.2016, 19:28. Показов 787. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток.

В коде, который приведен ниже, поставлена задача - не допустить одновременное выполнение задачи разными потоками, а именно - не допустить одновременного взлёта самолетов:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class Solution5 { 
 
    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");
    }
 
    public static class Plane extends Thread {
 
        public Plane(String name) {
            super(name);
            start();
        }
 
        public void run() {
 
            boolean  isAlreadyTakenOff = false;
 
            while (!isAlreadyTakenOff) {
                if (RUNWAY.getTakingOffPlane() == null) {                           
 
                //если взлетная полоса свободна
                    RUNWAY.setTakingOffPlane(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(); //ожидает
                }
            }
        }
    }
 
    private static void waiting() {
        //add your code here - добавь код тут
        try {
        Thread.currentThread().sleep(100);
    } catch(InterruptedException e) {
    }
    }
 
    private static void takingOff() {
        //fix this method - исправь этот метод
        try {
            Thread.currentThread().sleep(100);
        } catch (InterruptedException e) {
        }
    }
 
    public static class Runway { //взлетная полоса
        private Thread t;
 
        public synchronized Thread getTakingOffPlane() {
            return t;
        }
 
        public void setTakingOffPlane(Thread t) {
            synchronized (this) {
                this.t = t;
            }
        }
    }
}
ожидается, что взлетать может только один самолет, в то время как остальные два - ждут. Но иногда я получаю в консоли вот такие выводы (и притом довольно часто):
Самолет #1 ожидает
Самолет #3 взлетает
Самолет #2 взлетает
Самолет #3 уже в небе
Самолет #1 ожидает
Самолет #2 уже в небе
Самолет #1 взлетает
Самолет #1 уже в небе

Самолет #1 взлетает
Самолет #3 ожидает
Самолет #2 ожидает
Самолет #2 ожидает
Самолет #1 уже в небе
Самолет #3 ожидает
Самолет #3 взлетает
Самолет #2 взлетает
Самолет #2 уже в небе
Самолет #3 уже в небе

Сколько не пересматривал код - не могу понять в чём дело. Почему самолеты взлетают одновременно?. Помогите пожалуйста разобраться.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.12.2016, 19:28
Ответы с готовыми решениями:

Возможно ли: выполнение подпрограммы в отдельном процессе, одновременное выполнение двух подпрограмм?
Всех приветствую :handshake: Пример @echo off call :PROG1 call :PROG2 exit /b :PROG1

Одновременное выполнение
работаю с monkeyrunner.bat , он запускает python Скрипты на андройде. Monkeyrunner путь_до_скрипта.py Но если запускаю 2 или более...

Одновременное выполнение
Здравствуйте, скажите пожалуйста как можно одновременно выполнить две операции Например, вот int a = 5; ...

2
50 / 49 / 25
Регистрация: 05.02.2016
Сообщений: 146
11.12.2016, 20:42
бакуард, видимо, кто-то быстрокрылый успевает взлететь пока кто-то тормозной находится в раздумьях между строчками 23 и 26
1
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 27
12.12.2016, 08:04  [ТС]
Спасибо Max Sys. Вопрос закрыт.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
12.12.2016, 08:04
Помогаю со студенческими работами здесь

Одновременное выполнение 3 действий
Мне нужно одновременное выполнение 3 действий: Проигрывание гиф Вывод динамического текста в label Скачивание файла с сайта ...

2 формулы и одновременное выполнение
Доброго всем дня! Есть необходимость расчета стоимости по разным критериям исходя из поиска в наименовании определенного...

Одновременное выполнение команд
Подскажите можно ли в Delphi и если можно то как реалиовать одновремменое выполнение. Допустим на форме 2 кнопки одна запускает цикл, при...

Одновременное выполнение действий
Доброго. Пишу что-то отдаленно напоминающее игру марио, используя windows forms. Нужно сделать, чтобы одновременно выполнялись различные...

Одновременное выполнение оператора if
Здравствуйте, господа. Есть код: if (AreAllAvailable("login.p1.worldoftanks.net")) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru