Java 为什么不能';我不能使用多线程来播放wav文件吗?

Java 为什么不能';我不能使用多线程来播放wav文件吗?,java,multithreading,wav,Java,Multithreading,Wav,//这个听力测试课是用剪辑来播放音乐的 import java.io.IOException; import javax.sound.sampled.*; class AudioTest { public void AudioPlay() { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); try{

//这个听力测试课是用剪辑来播放音乐的

    import java.io.IOException;
    import javax.sound.sampled.*;

    class AudioTest {

        public void AudioPlay() {

        ClassLoader classLoader = 

Thread.currentThread().getContextClassLoader();

        try{
          Clip clip = AudioSystem.getClip();
          AudioInputStream inputStream = 
AudioSystem.getAudioInputStream(
classLoader.getResourceAsStream("audio1.wav"));

           clip.open(inputStream);
           clip.start();
           while (!clip.isRunning())
               Thread.sleep(10);
           while (clip.isRunning())
               Thread.sleep(10);
           clip.close();
          } catch (Exception e)
            {
             System.out.println("Something failed");
            }
        //to see if the sound is finished playing 
        System.out.println("done");
        } 
    }

public class Test11 {

       public static void main(String[] args)
       throws IOException
       {
        AudioTest au1 = new AudioTest();
        au1.AudioPlay();
       }

    }
//上面的Test11类在播放.wav音乐文件时运行良好。但在Test15类中,我将这个文件与另一个线程放在一起并执行它,它显示了播放audio1.wav音乐文件的“Something field”消息

//多线程编码Test15如下所示:

    import java.io.IOException;
    import javax.sound.sampled.*;
//下面的听力测试类别与前面的编码完全相同

    class AudioTest {

      public void AudioPlay() {

        ClassLoader classLoader = 
Thread.currentThread().getContextClassLoader();
        try{
              Clip clip = AudioSystem.getClip();
              AudioInputStream inputStream = 
              AudioSystem.getAudioInputStream(
              classLoader.getResourceAsStream(
              "audio1.wav"));
              clip.open(inputStream);
              clip.start();
              while (!clip.isRunning())
                      Thread.sleep(0);
              while (clip.isRunning())
                      Thread.sleep(0);
              clip.close();
            } catch (Exception e)
              {
               System.out.println("something failed");
              }

        System.out.println("done"); 
        }
    }

    class ThreadDemo extends Thread {
       private Thread t;
       private String threadName;

       ThreadDemo( String name) {
          threadName = name;
          System.out.println("Creating " +  threadName );
       }

       public void run() {
         //System.out.println("Running " +  threadName );
       try {
           if (threadName == "Thread-1") {
               System.out.println("Thread-1 is been started.");  
           // Start to play .wav file here
           AudioTest au1 = new AudioTest();
                au1.AudioPlay();
           }  
           else if (threadName == "Thread-2") {
               for (int i = 0; i < 100; i ++) {
                   System.out.println(i + ": " +  threadName + " is been executed."); 
               }
           }
      }catch (Exception e) {
         System.out.println("Thread " +  threadName + " failed.");
      }
   }

   public void start () {
      System.out.println("Starting " +  threadName );
      if (t == null) {
         t = new Thread (this, threadName);
         t.start ();
      }
   }
}

public class Test15 {
   public static void main(String args[]) throws IOException
   {
      ThreadDemo T1 = new ThreadDemo("Thread-1");
      T1.start();

      ThreadDemo T2 = new ThreadDemo("Thread-2");
      T2.start();
   }   
 }
class听力测试{
公共音乐剧{
类加载器类加载器=
Thread.currentThread().getContextClassLoader();
试一试{
Clip Clip=AudioSystem.getClip();
音频输入流输入流=
AudioSystem.getAudioInputStream(
classLoader.getResourceAsStream(
"audio1.wav);;
clip.open(输入流);
clip.start();
而(!clip.isRunning())
睡眠(0);
while(clip.isRunning())
睡眠(0);
clip.close();
}捕获(例外e)
{
System.out.println(“出现故障”);
}
系统输出打印项次(“完成”);
}
}
类ThreadDemo扩展线程{
私有线程t;
私有字符串threadName;
ThreadDemo(字符串名称){
threadName=名称;
System.out.println(“创建”+threadName);
}
公开募捐{
//System.out.println(“Running”+threadName);
试一试{
如果(threadName==“Thread-1”){
System.out.println(“线程1已启动”);
//在这里开始播放.wav文件
AudioTest au1=新的AudioTest();
au1.音频播放();
}  
否则如果(threadName==“Thread-2”){
对于(int i=0;i<100;i++){
System.out.println(i+“:“+threadName+”已被执行。”);
}
}
}捕获(例外e){
System.out.println(“线程”+threadName+“失败”);
}
}
公共无效开始(){
System.out.println(“起始”+threadName);
如果(t==null){
t=新线程(此,线程名称);
t、 开始();
}
}
}
公共类测试15{
公共静态void main(字符串args[])引发IOException
{
ThreadDemo T1=新的ThreadDemo(“Thread-1”);
T1.start();
ThreadDemo T2=新的ThreadDemo(“Thread-2”);
T2.start();
}   
}
//上面的类Test15可以运行,但Thread-1只能在不播放任何音乐的情况下启动,并显示“something failed”。看起来线程2运行正常


//我的最终目标是展示一个动人的乐谱和它的匹配音乐audio.wav。如果Test15中的线程1正在工作,那么我将在代码中添加移动分数编码为线程2。如果您感兴趣,我可以通过Stackoverflow或电子邮件向您发送此移动分数编码:dienfoonwu@gmail.com

您应该打印出异常e的内容,这样您就可以找出实际失败的内容。如何打印出异常e的内容?请尝试.catch(异常e){//printStackTrace方法//打印行号+调用堆栈e.printStackTrace();//打印System.out.println(e);}请将错误消息的文本复制到您的问题中。您应该打印出
异常e
的内容,这样您就可以找出实际失败的内容。如何打印异常e的内容?请尝试.catch(异常e){//printStackTrace方法//打印行号+调用堆栈e.printStackTrace();//打印System.out.println(e);}引发的异常。请将错误消息的文本复制到问题中。