Java 以不同的线程播放多首MP3曲目

Java 以不同的线程播放多首MP3曲目,java,multithreading,mp3,jlayer,Java,Multithreading,Mp3,Jlayer,我试图在不同的线程中同时运行4个MP3曲目。我正在用电脑播放MP3。考虑到我无法控制线程何时启动,我使用倒计时锁存器至少让它们同时运行。但是,每次我运行程序时,曲目都会播放,但会始终在不同的时间开始播放,从而导致它们不定时 以下是我的节目: 公共类MP3{ 私有字符串文件名; 私人玩家; 专用最终倒计时锁存器runlatch; //采用MP3文件名的构造函数 公共MP3(字符串文件名,CountDownLatch runlatch){ this.filename=文件名; this.runloc

我试图在不同的线程中同时运行4个MP3曲目。我正在用电脑播放MP3。考虑到我无法控制线程何时启动,我使用倒计时锁存器至少让它们同时运行。但是,每次我运行程序时,曲目都会播放,但会始终在不同的时间开始播放,从而导致它们不定时

以下是我的节目:

公共类MP3{
私有字符串文件名;
私人玩家;
专用最终倒计时锁存器runlatch;
//采用MP3文件名的构造函数
公共MP3(字符串文件名,CountDownLatch runlatch){
this.filename=文件名;
this.runlock=runlock;
}
//将MP3文件播放到声卡
公共游戏{
试一试{
FileInputStream fis=新的FileInputStream(文件名);
BufferedInputStream bis=新的BufferedInputStream(fis);
System.out.println(文件名);
玩家=新玩家(bis);
}
捕获(例外e){
System.out.println(“播放问题文件”+文件名);
系统输出打印ln(e);
}
//在新线程中运行以在后台播放
线程跟踪=新线程(){
公开募捐{
试试{
试一试{
runlack.countDown();
runlack.await();
player.play();
}捕捉(中断异常e){
系统输出打印ln(e);
} 
}
catch(异常e){System.out.println(e);}
}
};
track.start();
}
//测试客户端
公共静态void main(字符串[]args)引发InterruptedException{
CountDownLatch runlatch=新的CountDownLatch(4);
字符串filename1=args[0];
字符串filename2=args[1];
字符串filename3=args[2];
字符串filename4=args[3];
MP3 track1=新的MP3(filename1,runlock);
MP3 track2=新的MP3(文件名2,runlatch);
MP3 track3=新的MP3(filename3,runlock);
MP3 track4=新的MP3(文件名4,runlatch);
track1.play();
track2.play();
track3.play();
track4.play();
}
}
我知道,在最后一个线程打开闩锁后,我无法控制每个线程如何执行代码。似乎我必须进入JLayer1.0实现,才能更好地控制MP3何时开始播放


有没有简单的方法可以让MP3曲目在播放过程中保持同步?我知道a已经用java实现了,但它似乎比我想要的更复杂。

阅读CountdownLatch的API让我想知道您是否可以按照您尝试的方式使用它

“一种同步辅助工具,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。”

CountdownLatch示例中的run方法如下所示:

public void run() {
      try {
        startSignal.await();
        doWork();
        doneSignal.countDown();
      } catch (InterruptedException ex) {} // return;
  }
它等待开始信号,但直到其工作方法完成后才进行倒计时。看起来您使用了CountdowLatch,它的真正目的是确保在主线程完成之前完成所有线程

我的建议是:像现在这样启动每个线程,但是不要使用CountdownLatch,而是让每个线程在一个静态布尔值上循环,直到值变为false。这样,您可以启动所有线程,然后将ThreadLocal设置为false,它们都应该调用play()。请注意,这可能不是生产质量代码,您确实应该让每个线程侦听事件,但请尝试一下

总的问题可能是,线程的操作系统调度是罪魁祸首,这也是JPlayer 1.0开发人员想出的解决方案,但如果硬件和操作系统合作,应该能够使每个线程的play()在同一时间发生正负两毫秒

最后一次编辑:我越是关注CountdownLatch,就越认为可以使用它来同步开始的线程。您不希望每个线程都有倒计时,您只希望:

startSignal.await();
play();

只是一个想法。也许多音轨播放正是你想要的那样复杂。线程不容易控制和同步。如果这件事是自动发生的,那就省去你自己的痛苦;有人已经弄明白了。(再说一次,如果这些谜题让你觉得有趣,祝你好运)