ゲームでのサウンドの再生に問題があります。サウンドの再生を処理するスレッドが終了するとき、その実行メソッドは終了/終了/停止しません。すべてをコメントアウトするとスレッドが作成されなくなるため、このメソッドが問題の原因であることはわかっています。(JVisualVMで確認)。問題は、実行メソッドを終了した後、スレッドが終了しないことです。実際に run() メソッドの最後に到達するように print コマンドを配置しましたが、常に実行されます。
しかし、 でプロセスを確認すると、サウンドを再生するたびJVisualVM
にスレッド数が増加します。また、再生されるサウンドごと1
にデーモン スレッドの数が増加することにも注目しました。1
デーモン スレッドとは何か、どのように機能するのかはわかりませんが、さまざまな方法でスレッドを強制終了しようとしました。リターンによるメソッドのインクルードThread.currentThread
.stop()
.destroy()
.suspend()
.interrupt()
とリターン。run()
このメッセージを書いているときに、クリップ オブジェクトを閉じる必要があることに気付きました。これにより、余分なスレッドが作成および維持されることはありませんでした。しかし、今では音が時々消えてしまい、その理由がわかりません。現在、サウンドを並行して使用するか、無数のスレッドによって CPU が過負荷になるのを確認するか、新しいサウンドが再生されるたびにサウンドが突然終了するかを選択できます。
誰かが複数のサウンドを並行して再生する別のアプローチを知っているか、私のコードの何が問題なのかを知っている場合は、助けていただければ幸いです。
メソッドは次のとおりです。
public static synchronized void playSound(final String folder, final String name) {
new Thread(new Runnable() { // the wrapper thread is unnecessary, unless it blocks on the Clip finishing, see comments
@Override
public void run() {
Clip clip = null;
AudioInputStream inputStream = null;
try{
do{
if(clip == null || inputStream == null)
clip = AudioSystem.getClip();
inputStream = AudioSystem.getAudioInputStream(SoundP.class.getResource(folder + "/" + name));
if(clip != null && !clip.isActive())
inputStream = AudioSystem.getAudioInputStream(SoundP.class.getResource(folder + "/" + name));
clip.open(inputStream);
clip.start();
}while(clip.isActive());
inputStream.close();
} catch (LineUnavailableException e) {
e.printStackTrace();
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}