Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
1

Поток ожидающий команд (Менеджер звуков)

14.05.2015, 17:34. Показов 694. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу небольшую игру на Java + Swing.
Для воспроизведения звуков у меня предназначен специальный класс-перечисление Sound.

Java
1
2
//  пример - воспроизводим звук
Sound.SHIELD.play();
Однако как я вскоре понял, воспроизводить звук в том же потоке, который занимается отрисовкой не стоит.
В моменты особенно "крутых замесов" были заметны легкие подлагивания. Плюс подтормаживания если в момент игры воспроизводится музыка через плеер/браузер.

Поэтому я набросал небольшой вспомогательный класс SoundManager.
Его задача - создать поток, который будет спать, и ждать команды play(Sound sound).

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
public class SoundManager implements Runnable{
    Object lock;
    Sound toPlay;
    
    public SoundManager(){
        lock = new Object();
        new Thread(this, "Sound Thread").start();
    }
    
    public void close(){
        play(null);
    }
    
    public void play(Sound sound){
        toPlay = sound;
        synchronized(lock){ lock.notify(); }
    }
    
    public void run(){
        while(true){
            synchronized(lock){
                try {
                    lock.wait();
                    if(toPlay != null)
                        toPlay.play();
                    else break;
                } catch(InterruptedException e){ break; }
            }
        }
    }
}
С мультипоточностью у меня вооруженный нейтралитет, поэтому нужен ваш совет.
Насколько корректен вообще этот код и нет ли в нем каких-нибудь ошибок?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.05.2015, 17:34
Ответы с готовыми решениями:

Батник, ожидающий запуск другого приложения
Короче пытаюсь сделать сам, но не выходит в веду нехватки опыта в этом. Короче тема следующая....

Даны набор гласных звуков и текст. Составьте набор, кроме гласных звуков в тексте
Даны набор гласных звуков и текст. Составьте набор, кроме гласных звуков в тексте

Даны набор гласных звуков и текст. Составьте набор, кроме гласных звуков в тексте
Даны набор гласных звуков и текст. Составьте набор, кроме гласных звуков в тексте

Временно отменить добавление команд в очередь команд диалогового окна
Добрый день, уважаемые программисты! Начнём по порядку... Я пишу оконное приложение на WinApi,...

1
62 / 44 / 14
Регистрация: 01.07.2009
Сообщений: 145
16.05.2015, 14:09  [ТС] 2
Чтобы вопрос не висел без ответа, и не создавал ложного ощущения, что мой код идеален, запощу тут ответы, полученные мной в интернете. =)

1) Присвоение звука переменной toPlay надо тоже синхронизовать, чтобы избежать ситуации, когда два разных потока пытаются вызвать play(sound) и play(null). Из за чего переменная может проскочить проверку на null но передать классу Sound null-евое значение.
Java
1
2
3
4
5
6
public void play(Sound sound) {
    synchronized(lock){
        toPlay = sound;     
        lock.notify(); 
    }
}
Плюс, желательно ввести проверку на тот случай, если кто-то захочет воспроизвести звук на уже закрытом потоке.
Навредить это особо не сможет (как мне кажется), но было бы вежливо по отношению к юзеру метнуть ему исключение, или хотябы false.

2) Мне вообще намекнули что "не надо вам тут весь этот огород с wait-notify городить", и что надо просто сделать так:
Java
1
2
3
4
5
6
7
8
9
10
11
public class SoundManager {
    private final ExecutorService executor = Executors.newSingleThreadExecutor();
 
    public void playSound(Sound sound) {
        executor.execute(sound::play);
    }
 
    public void close() {
        executor.shutdown();
    }
}
Для старых версий Java функция play будет выглядеть так:
Java
1
2
3
4
5
6
7
public void play(final Sound sound) {
    executor.execute(new Runnable(){
        public void run(){
            sound.play();
        }
    });
}
0
16.05.2015, 14:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.05.2015, 14:09
Помогаю со студенческими работами здесь

Таблица футбольных команд: Сформировать показатели команд заданного континента
Есть вот такое задание. Рейтинговая таблица футбольных сборных содержит следующие сведения:...

Пример какой-нибудь программы на ассемблере с применением логических команд и команд сдвига.
Разработка программ на ассемблере при реализации логических команд и команд сдвига. Очень нужна...

Группа команд пересылки и арифметико-логических команд
Помогите, какие способы адресации есть у 1 и 2 группы команд? (не менее 8, но буду рад любой...

Даны список футбольных команд высшей лиги России и количество очков, набранных каждой командной в чемпионате России. Известно, что нет команд с равным
Даны список футбольных команд высшей лиги России и количество очков, набранных каждой командной в...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru