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);}引发的异常。请将错误消息的文本复制到问题中。