Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/19: Рейтинг темы: голосов - 19, средняя оценка - 4.63
1 / 1 / 2
Регистрация: 07.02.2011
Сообщений: 221

"Спящий парикмахер", используя семафоры

05.12.2011, 11:05. Показов 3818. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, подскажите если у кого есть код для задачки про спящего парикмахера, алгоритм понятен, но написать используя семафоры не получается!
спасибо!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.12.2011, 11:05
Ответы с готовыми решениями:

Спящий парикмахер. Многопоточность
Доброго времени суток, уважаемые форумчане! Прошу вашего совета. Начинаю осваивать Java и решил написать программку реализующую решение...

Спящий парикмахер. Многопоточность
Рассмотрим парикмахерскую, в которой работает один парикмахер, имеется одно кресло для стрижки и несколько кресел в приемной для...

Спящий парикмахер, как ни странно
Добрый день. У меня есть задача написать Спящего парикмахера. И вот тут я столкнулся с проблемой - как реализовать программу в 2...

6
614 / 488 / 175
Регистрация: 02.03.2010
Сообщений: 1,238
05.12.2011, 12:27
Мне кажется, или в Java нет семафоров?
Тут через потоки (класс Thread или интерфейс Runnable)
Методы объявлять с модификатором synchronized
Для пробуждения потока notify()
Для постановки в очередь ожидания wait()
0
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
06.12.2011, 00:38
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
Object full  = new Object();
Object empty = new Object();
 
public void push(Object d) {
synchronized(full) {
 if (data != null) full.wait();
}
 
data = d;
 
synchronized(empty) {
 if (data != null) empty.notify();
}
}
 
public Object pop() {
synchronized(empty) {
 if (data == null) empty.wait();
}
 
Object o = data;
data = null;
 
synchronized(full) {
 if (data == null) full.notify();
}
 
return o;
}
0
1 / 1 / 0
Регистрация: 01.06.2010
Сообщений: 20
12.12.2011, 00:12
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
package Theard3;
 
public class ThreadDemo3 implements Runnable{int i = 0;
ThreadDemo3() {
Thread ct = Thread.currentThread();
System.out.println("currentThread: " + ct);
Thread t = new Thread(this, "Стрижка");
System.out.println("Thread created: " + t);
boolean h = false;
t.start();
try {
    //у парикмахера это сколько раз он проверит очередь.
        for (int j = 7; j > 0; j--){Thread.sleep(1000);
        if(i==0) {System.out.println("Парикмахер спит "+h+" (количество занятых мест в очереди) - "+i);}
        else{
            //if (h=false)
            //{System.out.println("Клиент будит парикмахера");}
            
                if(h==false) {
                       // h=true; System.out.println(i); i--;;
                       h=true; --i;
                        System.out.println("Началась стрижка клиента "+h+" (количество занятых мест в очереди) - "+i);
                        Thread.sleep(2000);
                        System.out.println("Стрижка клиента закончилась "+h+" (количество занятых мест в очереди) - "+i);
                h=false;
                }
}}}
catch (InterruptedException e) {
System.out.println("Остановить");
}
System.out.println("Парикмахер устал и ушел с работы");
}
public void run() {
try {
    //В подпроцессе клиентов 7 - это количество клиетнов.
    for (int j = 7; j > 0; j--) {System.out.println("Пришел клиент (количество занятых мест в очереди) - "+i);
    if(i<3)
    {if(i==0)
    {++i; System.out.println("Клиент будит парикмахера (количество занятых мест в очереди) - "+i);
    Thread.sleep(1000);
    } 
    else
    {++i; System.out.println("Места есть. Клиент занял очередь (количество занятых мест в очереди) - "+i);
    }
    }
    else    
System.out.println("Мест нет. Клиент ушел. (количество занятых мест в очереди) - "+i);
    Thread.sleep(1000);
    }
}
 
/* Обратите внимание — цикл заключен в try/catch блок. 
 * Дело в том, что метод Thread.sleep() может возбуждать исключение InterruptedException. 
 * Это исключение возбуждается в том случае, если какому-либо другому подпроцессу понадобится 
 * прервать данный подпроцесс. 
 * В данном примере мы в такой ситуации просто выводим сообщение о перехвате исключения.*/
catch (InterruptedException e) {
System.out.println("child остановлен");
}
System.out.println("Клиенты закончились");
}
public static void main(String args[]) {
new ThreadDemo3();
}
}
1
severecg
26.12.2011, 21:00
Цитата Сообщение от Naymen Посмотреть сообщение
Java
1
2
3
4
5
6
7
8
package Theard3;
 
 
System.out.println("currentThread: " + ct);
Thread t = new Thread(this, "Стрижка");
System.out.println("Thread created: " + t);
boolean h = false;
t.start();
подскажите, что значит эта строчка - Thread t = new Thread(this, "Стрижка");
а конкретно "стрижка"... зачем этот кусочек кода?
 Аватар для mutagen
2587 / 2260 / 257
Регистрация: 14.09.2011
Сообщений: 5,185
Записей в блоге: 18
27.12.2011, 01:00
там есть
Java
1
implements Runnable
а в коде есть
Java
1
2
3
4
    @Override
    public void run() {
        // чтото происходит
}
так вот - при таком раскладе эта строчка значит:
создать новый поток(нить) из текущего обьекта(который есть Runnable), который при старте запустит на выполнение то что в методе run и при этом этот Thread получит имя "Стрижка"
1
severecg
27.12.2011, 09:37
спасибо, выручил меня!
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.12.2011, 09:37
Помогаю со студенческими работами здесь

Задача "Спящий парикмахер"
Пытался реализовать задачу &quot;Спящего парикмахера&quot; на Си под Linux, но при выполнении программы выводятся некорректные данные. Я создаю...

"Спящий Парикмахер"
Одна классическая задача на синхронизацию процессов – это так называемая «задача о спящем парикмахере». Рассмотрим парикмахерскую, в...

Синхронизация, используя мьютексы и семафоры
Добрый день,с синхронизацией через критические секции самому получилось разобраться,а вот с мьютексами и семафорами есть проблемы... ...

Синхронизация используя семафоры или мьютексы
Добрый день, добрые люди подскажите у меня есть 4 потока и в них выполняеться вычеление функции A= (B+C)*(MC*MD), и мне нужно все 4 потока...

Разработать программу, демонстрирующую работу процессов используя семафоры
Необходимо разработать программу, демонстрирующую работу процессов используя семафоры? Может у кого-нибудь есть примеры... или...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru