Извините, это немного поздно, но сегодня я столкнулся с проблемой, которая звучит подозрительно знакомой. В некотором игровом коде, я использую javax.sound.sampled.Clip для воспроизведения различных звуков, я обнаружил, что если я не буду явно вызывать line.close (), как только он будет закончен, счетчик собственных потоков в профилировщике будет просто -рокет до тех пор, пока я не получу ошибку OutOfMemory.
// this just opens a line to play the sample
Clip clip = AudioSystem.getClip();
clip.open( audioFormat, sounddata, 0, sounddata.length);
clip.start();
// at this point, there is a native thread created 'behind the scenes'
// unless I added this, it never goes away:
clip.addLineListener( new LineListener() {
public void update(LineEvent evt) {
if (evt.getType() == LineEvent.Type.STOP) {
evt.getLine().close();
}
}
});
Мое предположение состоит в том, что клип создает поток для измерения байтов семпла в строке, но поток после этого зависает на случай, если вы захотите повторно использовать клип снова. Мое второе предположение заключается в том, что где-то в моем коде должна быть ссылка на клип, или наоборот, но, во всяком случае, фрагмент кода выше выявил проблему.
Надеюсь, это кому-нибудь пригодится.