Java 我如何调用我的音乐类并在调用音乐类的行下执行我的行的while循环中播放音乐?

Java 我如何调用我的音乐类并在调用音乐类的行下执行我的行的while循环中播放音乐?,java,Java,我有两节课,我想知道如何调用我的音乐课(MP3课2),让歌曲在第一节课的while循环中播放。我的问题是当我使用MP3.main(args)时类1中的while循环没有执行MP3.main(args)行下面的内容。因此,“输入命令”文本不会显示。我想我需要重新创建我的MP3类并传递参数,如果这是术语的正确用法。对不起,我对java还是新手 请注意,我已经删除了大量的代码从类一,因为它的一个项目 万一有人问我为什么你不删除第一类,把文本移到第二类,这不是长话短说的选择 **第1类**尝试播放第2类

我有两节课,我想知道如何调用我的音乐课(MP3课2),让歌曲在第一节课的while循环中播放。我的问题是当我使用
MP3.main(args)时类1中的while循环没有执行
MP3.main(args)行下面的内容。因此,“输入命令”文本不会显示。我想我需要重新创建我的MP3类并传递参数,如果这是术语的正确用法。对不起,我对java还是新手

请注意,我已经删除了大量的代码从类一,因为它的一个项目

万一有人问我为什么你不删除第一类,把文本移到第二类,这不是长话短说的选择

**第1类**尝试播放第2类中的音乐,但程序没有执行
MP3.main(args)行下面的内容在我的while循环中

public class ClassTest {
    public static void main(String[] args) {
        // create the loop
        while (true) {
            MP3.main(args);
            System.out.println("Enter a command: ");
        }
    }
} 
第2类MP3类

import javazoom.jl.player.Player;

import java.io.BufferedInputStream;
import java.io.FileInputStream;


class MP3 {
    private static String filename = null;

    // constructor that takes the name of an MP3 file
    public MP3(String filename) {
        this.filename = filename;
    }

    // play the MP3 file to the sound card
    public static void play() {
        try {
            FileInputStream fis     = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            Player player = new Player(bis);
            player.play();
        }
        catch (Exception e) {
            System.out.println("Problem playing file " + filename);
            System.out.println(e);
        }
    }


    // test client
    public static void main(String[] args) {
        String filename = ("Growth.mp3");
        MP3 mp3 = new MP3(filename);
        mp3.play();

        try {
            FileInputStream fis     = new FileInputStream(filename);
            BufferedInputStream bis = new BufferedInputStream(fis);
            Player player = new Player(bis);
            player.play();
        }
        catch (Exception e) {
            System.out.println("Problem playing file " + filename);
            System.out.println(e);
        }
    }

}
查看
play()
方法可以发现这是一个阻塞操作。您可以在单独的线程中调用该方法,以便在播放器完成后进行测试并重新调用play方法,如下所示:

MP3.java

导入javazoom.jl.player.player;
导入java.io.BufferedInputStream;
导入java.io.FileInputStream;
导入java.util.concurrent.ExecutorService;
导入java.util.concurrent.Executors;
公共级MP3{
私有最终字符串文件名;
私人遗嘱执行人服务;
私人玩家;
公共MP3(字符串文件名){
this.filename=文件名;
}
公共游戏{
试一试{
FileInputStream fis=新的FileInputStream(文件名);
BufferedInputStream bis=新的BufferedInputStream(fis);
玩家=新玩家(bis);
player.play();
}捕获(例外e){
System.out.println(“播放问题文件”+文件名);
e、 printStackTrace();
}
}
public void playsync(){
if(executorService==null){
executorService=Executors.newSingleThreadExecutor();
executorService.submit(this::play);
}
}
公众假期{
while(true){
睡眠();
如果(player==null | | player.isComplete()){
System.out.println(“仍在播放:“+filename”);
stopAsync();
PlaySync();
}
}
}
公共void stopAsync(){
如果(玩家!=null){
player.close();
player=null;
}
if(executorService!=null){
executorService.shutdown();
executorService=null;
}
}
私人虚空睡眠(){
试一试{
睡眠(500);
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
DemoApplication.java

公共类演示应用程序{
公共静态void main(字符串[]args){
字符串文件名=(“Growth.mp3”);
MP3=新的MP3(文件名);
mp3.playForever();
}
}

Static是一种存储工具,而不是访问工具。您不应该以这种方式使用它是否确定
player.play()
没有挂起?此处可能重复:您可能需要调用
player.stop()
来停止播放机
.play()
正在阻塞