2015-09-08 114 views
3

我正在創建一個需要大量聲音才能快速播放的遊戲。每個聲音都由一個Sound類表示,其中的play()方法創建一個Thread對象以異步修改該剪輯,因爲某種原因clip.stop()在一段時間後引起了明顯的延遲。我的問題是,過了一段時間,所有這些線程建立起來,最終程序崩潰與OutOfMemoryError。如何在Java中立即停止線程

public void play() 
{ 
    Thread thread = new Thread() 
    { 
     public void run() 
     { 
      if (clip.isRunning()) clip.stop(); 
      clip.setFramePosition(0); 
      if (isAmbient) clip.loop(Clip.LOOP_CONTINUOUSLY); 
      else clip.start(); 
      try 
      { 
       Thread.sleep(clip.getMicrosecondLength()/1000); 
       join(); 
      } 
      catch (InterruptedException ie) 
      { 
       ie.printStackTrace(); 
      } 
     } 
    }; 
    thread.setDaemon(true); 
    thread.start(); 
} 

我試圖尋找其他地方的這個問題的答案,但我創建的線程不會循環;他們只需要執行一次然後立即死亡。如果我不使用這些線程,就像我之前所說的那樣,連續播放相同的聲音會在一段時間後顯着延遲。我不太確定這個聲音引擎,所以任何指向一個可以暫停和可恢復的wav播放器的指針都會被讚賞。

+0

你考慮過[Thread Pool](https://docs.oracle.com/javase/tutorial/essential/concurrency/pools.html)嗎? – OldCurmudgeon

回答

0

您在線程內使用join(),這沒有任何意義。當線程不再活動時,方法返回Join。在你的情況下,你在活着的線程中調用join方法,它永遠不會返回。