Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 54

Бесполезная коробка закрывает себя 2 раза

20.06.2022, 05:42. Показов 743. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день! Реализую бесполезную коробку через многопоточность. Вопрос в следующем: почему (см. скриншот) иногда коробка себя два раза закрывает (хотя так не должно быть).. Как это исправить, прошу помочь?

Кликните здесь для просмотра всего текста

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
import box.Box;
 
public class Main {
    public static void main(String[] args) throws InterruptedException {
 
        Box box = new Box();
 
        Thread user = new Thread(null, box::openUp, "Пользователь");
        user.start();
        Thread.sleep(2000);
 
        Thread toy = new Thread(null, box::close, "Вредная игрушка");
        toy.start();
 
        user.join();
        toy.interrupt();
    }
}
package box;
 
public class Box {
    private Switch aSwitch = new Switch();
 
    public void openUp() {
        int attemptNumber = 10;
        int newAttemptInterval = 4000;
        for (int i = 0; i < attemptNumber; i++) {
            try {
                Thread.sleep(newAttemptInterval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            aSwitch.turnOn();
        }
    }
 
    public void close() {
        while (!Thread.currentThread().isInterrupted()) {
            aSwitch.turnOff();
        }
    }
}
package box;
 
public class Switch {
    private volatile boolean isOn = false;
 
    public void turnOn() {
        if (!isOn) {
            isOn = true;
            System.out.println("\n-тумблер включен");
        }
    }
 
    public void turnOff() {
        if (isOn) {
            isOn = false;
            System.out.println("тумблер выключен");
        }
    }
}

Миниатюры
Бесполезная коробка закрывает себя 2 раза  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.06.2022, 05:42
Ответы с готовыми решениями:

Бесполезная электростанция
Кроме того, он создал аппаратуру для использования бесполезно растрачиваемой (обычно) энергии детей, которые, как известно, ни минуты не...

Вирус не дает возможность скачать антивирус, блокирует сайты, закрывает диспетчер задач и gpedit.msc и закрывает браузер
Здравствуйте. В последнее время компьютер стал будто разгонятся, при запуске диспетчера кулера успокаивались. При попытке скачать антивирус...

string getline(cin, n) просит ввести себя два раза, хотя функцию вызываю раз
Программа почему-то просит ввести строку два раза после того, как ввел категорию данных для смены. Еще мне нужно каким то образом...

13
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
20.06.2022, 09:53
Цитата Сообщение от berserk2005 Посмотреть сообщение
Как это исправить, прошу помочь?
1) Синхронизация методов;
2) boolean => AtomicBoolean;
3) Локи.
1
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 54
21.06.2022, 12:21  [ТС]
Спасибо!
Я сделал так:

Кликните здесь для просмотра всего текста

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
import box.Box;
 
public class Main {
    public static void main(String[] args) throws InterruptedException {
 
        Box box = new Box();
 
        Thread user = new Thread(null, box::openUp, "Пользователь");
        user.start();
        Thread.sleep(2000);
 
        Thread toy = new Thread(null, box::close, "Вредная игрушка");
        toy.start();
 
        user.join();
        toy.interrupt();
    }
}
package box;
 
public class Box {
    private Switch aSwitch = new Switch();
 
    public void openUp() {
        int attemptNumber = 10;
        int newAttemptInterval = 4000;
        for (int i = 0; i < attemptNumber; i++) {
            try {
                Thread.sleep(newAttemptInterval);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            aSwitch.turnOn();
        }
    }
 
    public void close() {
        while (!Thread.currentThread().isInterrupted()) {
            aSwitch.turnOff();
        }
    }
}
package box;
 
import java.util.concurrent.atomic.AtomicBoolean;
 
public class Switch {
    private AtomicBoolean isOn = new AtomicBoolean(false);
 
    public synchronized void turnOn() {
        if (!isOn.get()) {
            isOn = new AtomicBoolean(true);
            System.out.println("\n-тумблер включен");
        }
    }
 
    public synchronized void turnOff() {
        if (isOn.get()) {
            isOn = new AtomicBoolean(false);
            System.out.println("тумблер выключен");
        }
    }
}
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
21.06.2022, 13:22
berserk2005, ну если используешь синхронизацию по this (synchronized над методом), то нет смысла в Atomic* - с переменной будет работать один поток.
1
0 / 0 / 0
Регистрация: 07.12.2021
Сообщений: 54
21.06.2022, 13:53  [ТС]
я всё осознал:
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
package box;
 
import java.util.concurrent.atomic.AtomicBoolean;
 
public class Switch {
    private AtomicBoolean isOn = new AtomicBoolean();
 
    public void turnOn() {
        if (!isOn.get()) {
            isOn.set(true);
            System.out.println("\n-тумблер включен");
        }
    }
 
    public void turnOff() {
        if (isOn.get()) {
            isOn.set(false);
            System.out.println("тумблер выключен");
        }
    }
}
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
22.06.2022, 17:11
Цитата Сообщение от berserk2005 Посмотреть сообщение
я всё осознал:
убери thread sleep везде и проверь два твоих последних варианта
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
22.06.2022, 18:44
asdzxc, а что с ними не так?
0
Эксперт Java
3639 / 2971 / 918
Регистрация: 05.07.2013
Сообщений: 14,220
22.06.2022, 18:58
Цитата Сообщение от Arsegg Посмотреть сообщение
а что с ними не так?
Цитата Сообщение от berserk2005 Посмотреть сообщение
public void turnOn() {
        if (!isOn.get()) {
            isOn.set(true);
вроде, что-то, все же, не так
1
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
22.06.2022, 19:13
xoraxax, ты прав.
Получается что-то вроде:
Java
1
2
3
4
5
6
7
8
9
10
11
    public void turnOn() {
        if (isOn.compareAndSet(false, true)) {
            System.out.println("\n-тумблер включен");
        }
    }
 
    public void turnOff() {
        if (isOn.compareAndSet(true, false)) {
            System.out.println("тумблер выключен");
        }
    }
Добавлено через 5 минут
xoraxax, а в чем косяк с первым вариантом? Он же thread-safe?
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
22.06.2022, 19:24
Цитата Сообщение от Arsegg Посмотреть сообщение
а в чем косяк с первым вариантом? Он же thread-safe?
он thread-safe, но требуемое поведение "тик-так" получается из-за sleep, как и в варианте с AtomicBoolean

Arsegg, вот так у меня отработал твой вариант, где голый AtomicBoolean, когда я убрал sleep везде

-тумблер включен

-тумблер включен
тумблер выключен
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
22.06.2022, 20:36
asdzxc, без минимальной задержки, скорее всего, не получится желаемое поведение. Да и выглядит как вырожденный случай.
0
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
22.06.2022, 20:41
вроде вот так должно сработать

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Main
{
    public static void main(final String[] args) throws InterruptedException
    {
        final var lock = new Object();
        final var aSwitch = new Switch(lock);
        final var box = new Box(aSwitch);
 
        final var user = new Thread(null, box::openUp, "Пользователь");
        user.start();
 
        final var toy = new Thread(null, box::close, "Вредная игрушка");
        toy.start();
 
        Thread.currentThread().join();
    }
}
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
public class Box
{
    private final Switch aSwitch;
 
    public Box(final Switch aSwitch)
    {
        this.aSwitch = aSwitch;
    }
 
    public void openUp()
    {
        while (!Thread.currentThread().isInterrupted())
        {
            try
            {
                aSwitch.turnOn();
            }
            catch (final InterruptedException e)
            {
                throw new RuntimeException(e);
            }
        }
    }
 
    public void close()
    {
        while (!Thread.currentThread().isInterrupted())
        {
            try
            {
                aSwitch.turnOff();
            }
            catch (final InterruptedException e)
            {
                throw new RuntimeException(e);
            }
        }
    }
}
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
public class Switch
{
    private final Object lock;
 
    public Switch(final Object lock)
    {
        this.lock = lock;
    }
 
    public void turnOn() throws InterruptedException
    {
        synchronized (lock)
        {
            System.out.println("-тумблер включен");
            lock.notify();
            lock.wait();
        }
    }
 
    public void turnOff() throws InterruptedException
    {
        synchronized (lock)
        {
            System.out.println("тумблер выключен\n");
            lock.notify();
            lock.wait();
        }
    }
}
0
3582 / 2182 / 571
Регистрация: 02.09.2015
Сообщений: 5,510
22.06.2022, 20:42
asdzxc, ну с локами каждый сможет. Тут интерес представляет CAS.
1
226 / 184 / 80
Регистрация: 13.04.2014
Сообщений: 694
22.06.2022, 20:47
Задача ведь совсем другая была. Атомики дают только атомарность.

Синхронизация через sleep наверное самое ужасное
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.06.2022, 20:47
Помогаю со студенческими работами здесь

Функция, которая находит целое шестизначное число, которое при перевороте становится в 4 раза больше себя
Как написать эту функцию? Есть ли варианты? Напишите функцию, которая находит целое шестизначное число, которое при перевороте...

Нужно, чтобы форма распечатала сама себя, или только часть себя
Помогите, плиз! Нужно, чтобы форма (для этого имеется кнопка на форме) распечатала сама себя, или только часть себя. Как это сделать?...

Задача *Коробка*
Количество одинаковых квадратов со стороной 1 - не больше заданного числа. Найдите наибольшее возможный объем прямоугольной коробки (без...

Коробка с шоколадом
все здравствуйте помогите решить задачу буду очень благодарен Анатолию к новому году подарили большую коробку шоколадных конфет....

Мультимедийная коробка
Всем привет, сделал вот еще один сайт толком не знал что хотел, но вышло в итоге именно это =): Мультимедийная коробка... запусти я его 13...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru