在Java中播放背景音乐的唯一方法是多线程?

在Java中播放背景音乐的唯一方法是多线程?,java,playback,Java,Playback,我有一个游戏,主要是游戏逻辑。我只是根据我发现的文档添加了声音播放: //////////////////////SOUND///////////////////////// SourceDataLine soundLine = null; int BUFFER_SIZE = 64*1024; // 64 KB // Set up an audio input stream piped from the sound file. try {

我有一个游戏,主要是游戏逻辑。我只是根据我发现的文档添加了声音播放:

//////////////////////SOUND/////////////////////////
     SourceDataLine soundLine = null;
     int BUFFER_SIZE = 64*1024;  // 64 KB

      // Set up an audio input stream piped from the sound file.
      try {
         File soundFile = new File("tim ph3 samplepart1.wav");
         AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(soundFile);
         AudioFormat audioFormat = audioInputStream.getFormat();
         DataLine.Info info = new DataLine.Info(SourceDataLine.class, audioFormat);
         soundLine = (SourceDataLine) AudioSystem.getLine(info);
         soundLine.open(audioFormat);
         soundLine.start();
         int nBytesRead = 0;
         byte[] sampledData = new byte[BUFFER_SIZE];
         while (nBytesRead != -1) {
            nBytesRead = audioInputStream.read(sampledData, 0, sampledData.length);
            if (nBytesRead >= 0) {
               // Writes audio data to the mixer via this source data line.
               soundLine.write(sampledData, 0, nBytesRead);
            }
         }
      } catch (UnsupportedAudioFileException ex) {
         ex.printStackTrace();
      } catch (IOException ex) {
         ex.printStackTrace();
      } catch (LineUnavailableException ex) {
         ex.printStackTrace();
      } finally {
         soundLine.drain();
         soundLine.close();
      }
     /////////////////////////////////////////////////////
它播放我在Eclipse项目文件夹中的文件中指定的文件

问题出在哪里?它会阻止出现在主屏幕上的所有游戏逻辑

这是有意义的-程序是连续的,直到整首歌完成…我想游戏无法继续


这显然是行不通的,看来我必须使用可怕的多线程处理…但在此之前…我想知道…在这种情况下,是否有Java库或其他聪明的解决方案来避免多线程处理?

是的,您需要使用单独的线程。没什么可怕的。Java中的多线程是小菜一碟。看看并发包


注意:知道如何启动线程和知道如何安全地多线程处理程序是两件不同的事情。现在,请确保避免从多个线程接触相同的音乐。

多线程并不是那么可怕。我记得在学习之前我也有同样的感觉,但这很合乎逻辑。调试线程间共享资源中存在的bug,现在我担心:)这不是播放音乐的唯一方法,但如果您想同时执行任何其他操作,这是唯一的方法!换句话说,你没有选择的余地。学习如何使用多线程,并从中获得一些乐趣。好吧,我想我会学到一些东西。没有一个库具有专门针对任何人的需要的多线程功能。你必须做你想做的事,在线程中/同时你自己做。难的不是线程,而是线程之间的交互。只要你的线程只是在做自己的事情,你就会没事的。对了,我在一些我参加过的课程中使用了C多线程,这让我很害怕,因为你提到的潘多拉魔盒。谢天谢地,我想要的只是我的主线,音乐播放器,也许还有聊天,所以这没什么大不了的!酷。只要线程之间没有共享对象,就不必担心。幸运的是,Java有几个类和度量来支持同步操作——所以实际上,您主要需要注意死锁。(即A需要B释放C才能继续,B需要A释放C才能继续)