Проблема в том, что Clip
уже запускает фон демон нить для воспроизведения волнового файла.
Итак, поток выполнения вашего кода выглядит так:следует:
- основной поток запускает вторичный (бесполезный) поток
- дополнительный поток запускает поток демона (который будет воспроизводить звук)
- в среднемвремя основной поток продолжает печатать что-то, пока вторичный поток активен
- Когда вторичный поток завершает запуск потока воспроизведения, он заканчивается, поэтому вторичный поток не будет активнымсостояние больше
- основной поток заметит, что вторичный поток не активен и будет также завершен
- Поскольку поток воспроизведения является потоком демона , JVM завершит работу(потому что единственными оставшимися потоками являются потоки демонов)
Окончательный результат - именно то, что вы видите: некоторый текст печатается основным потоком во время запуска дополнительного потокаЕсли поток воспроизведения начнёт воспроизводиться, произойдет бум, JVM завершится.Иногда вы можете даже прослушать некоторые «щелчки» в наушниках (когда начинает воспроизводиться звук) до выхода из JVM.
Самое простое решение - сделать вторичный поток (т. Е. Не демоном)нить) спать во время воспроизведения звука.
...
clip.open(ais);
clip.loop(-1);
Thread.sleep(amountToSleep);
...
Одна важная вещь, на которую следует обратить внимание : около года назад, когда я работал с этим Java-API, я заметил, что метод getMicrosecondLength()
глючит.Я программировал как в Windows, так и в Linux, и на одной платформе я получил бы правильное значение, но на другой тот же самый метод вернул бы длину в миллисекундах!
Я обнаружил, что самый надежный способчтобы получить реальную длину звука, нужно использовать метод getFrameLength()
и рассчитать длину по нему.
Я не смог найти код, который написал тогда в этой записной книжке.Позже я проверю другой компьютер и, если найду его, выложу полный пример (который надежно работает как на Windows с Sun JVM, так и на Linux с OpenJDK или Sun).