当我运行此代码时,它会在音频播放时冻结。但是,我希望动画与音频同时运行。我怎样才能做到这一点?

时间:2019-04-26 00:11:48

标签: java multithreading swing audio

我一直在尝试使用Java Swing Graphics对角色进行动画处理。我从主屏幕过渡到应该在音频(WAV文件)运行时同时显示动画的JPanel。但是,音频首先运行,然后显示JPanel并对其进行动画处理。

如何在代码中修复此错误,以使音频和动画同时运行?

我知道Thread.sleep()函数存在错误,该错误迫使整个线程进入睡眠状态。但是,如果没有Thread.sleep(),我无法弄清楚如何运行音频,并且在使用Thread.sleep()方法的情况下,线程将无法同时运行。

我当前正在使用Java 8。

音频类

import java.io.*;
import javax.sound.sampled.*;
public class AudioManager
{
    static AudioInputStream audioInputStream = null;
    static Clip curClip = null;

    public static void playSound(String fileName)
    {

        System.out.println("Playing Sound");

            new Thread(new Runnable() 
            {

                public void run() 
                {
                    try 
                    {
                        audioInputStream = AudioSystem.getAudioInputStream(new File(fileName));
                        curClip = AudioSystem.getClip();

                        curClip.open(audioInputStream); //Opens Stream
                        curClip.start();

                        Thread.sleep(curClip.getMicrosecondLength() / 1000); //Pauses the thread
                        audioInputStream.close();
                        curClip.close();
                    }
                    catch(Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }).run();

    }
}

调用音频方法的动画师类

        Timer t1 = new Timer(background_Intro_Speed, new ActionListener() 
        {
            public void actionPerformed(ActionEvent e) 
            {
                System.out.println(isShowing());
                if(isShowing())
                {
                    System.out.println(audioOver);
                    if(audioOver && animated.xPosition <= 905)
                        animated.xPosition += 5;
                    else if(animated.xPosition > 905 && audioOver)
                    {
                        System.out.println("Animation Ended");
                        swapPanel();
                    }
                    else if(!audioOver)
                    {
                        new Thread(new Runnable() 
                        {           
                            public void run() 
                            {
                                System.out.println("In Thread");
                                AudioManager.playSound("foo.wav");
                                audioOver = true;
                            }
                        }).run();

                    }
                }
            }
        });
        t1.start(); 

1 个答案:

答案 0 :(得分:1)

}).run();

您的线程不是线程。您只是在执行Thread的run()方法。

代码应为:

}).start();

启动一个单独的线程,这样代码就不会在事件调度线程上执行。