Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/383.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
以延迟结束的Java线程_Java_Eclipse_Multithreading_Javasound - Fatal编程技术网

以延迟结束的Java线程

以延迟结束的Java线程,java,eclipse,multithreading,javasound,Java,Eclipse,Multithreading,Javasound,我正在尝试在java应用程序中播放mp3。用户可以单击按钮并更改声音 声音和切换工作…但是当用户尝试切换声音时,新歌开始在旧歌上播放约一秒钟,然后旧歌停止播放。我正在尝试使用线程来处理一切 我的MP3课程: import java.applet.*; import javazoom.jl.player.Player; import java.io.*; import java.io.FileInputStream; import java.net.*; public class mp3 ext

我正在尝试在java应用程序中播放mp3。用户可以单击按钮并更改声音

声音和切换工作…但是当用户尝试切换声音时,新歌开始在旧歌上播放约一秒钟,然后旧歌停止播放。我正在尝试使用线程来处理一切

我的MP3课程:

import java.applet.*;
import javazoom.jl.player.Player;
import java.io.*;
import java.io.FileInputStream;
import java.net.*;

public class mp3 extends Thread implements Runnable{

    private Player sound;
    private InputStream path;  
    public mp3(String file_name) {
        path = mp3.class.getClassLoader().getResourceAsStream(file_name);  
    }
    public void run(){
        try {
            Player sound=new Player(path);
            sound.play();
        } catch(Exception e) {System.out.println(e);}
    }
}
这就是我在主游戏中运行代码的方式。MP3对象称为歌曲

应用程序初始化时,将运行以下代码:

song = new mp3("default.mp3");
song.start();
song.stop();
song = new mp3(t+".mp3");
song.start();
如果有人试图更改,将运行以下代码:

song = new mp3("default.mp3");
song.start();
song.stop();
song = new mp3(t+".mp3");
song.start();
其中t是文件名的参数

我很确定问题在于MP3对象的run函数。我对穿线一无所知,所以我希望能得到一些帮助

同样,延迟大约是从调用“停止”到它实际停止播放的时间的1秒。那么也许在那里的某个地方等一下

谢谢

编辑:我正在使用基于以下内容的代码:

我创建了一个play and close函数,定义如下:

    public void close() { if (player != null) player.close(); }

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

        // run in new thread to play in background
        new Thread() {
            public void run() {
                try { player.play(); }
                catch (Exception e) { System.out.println(e); }
            }
        }.start();
我的问题是关闭函数…播放器对象总是空的,关闭函数不执行…即使播放函数初始化它。为什么为空?

编辑:

在编辑中,如果多个线程正在访问
播放器
字段,则应将其设置为
易失性
。如果看不到
player
是如何定义的,那么很难猜测问题的其他方面


我认为在开始下一个mp3之前,您需要确保
播放器
已完成上一个mp3。看这张照片,我看到:

引述:

如果所有可用的MPEG音频帧都已解码,则返回true,否则返回false

如果要在新声音开始时停止上一个音频,应在旧播放器上使用
close()

关闭此播放器。当前播放的任何音频都会立即停止

我觉得您需要关闭当前运行的
Player
对象(如果有),然后启动一个新的
Player
对象来播放新声音。如果要在多个线程中执行此操作,则需要执行以下操作:

  • 锁定一些
    最终对象锁定
    对象
  • 如果希望当前声音结束,请检查当前
    播放器
    对象(如果有)是否已通过
    睡眠
  • close()
    当前的
    Player
    对象,并创建一个新的
    Player
    ,如果您想消除当前的声音
  • 调用
    play()
    下一个mp3
  • 解锁锁定对象
  • 据我所知,
    play()
    方法并不等待声音播放,而是在将声音加载到音频缓冲区后立即返回。但我不确定如果音频文件很大会发生什么。

    编辑:

    在编辑中,如果多个线程正在访问
    播放器
    字段,则应将其设置为
    易失性
    。如果看不到
    player
    是如何定义的,那么很难猜测问题的其他方面


    我认为在开始下一个mp3之前,您需要确保
    播放器
    已完成上一个mp3。看这张照片,我看到:

    引述:

    如果所有可用的MPEG音频帧都已解码,则返回true,否则返回false

    如果要在新声音开始时停止上一个音频,应在旧播放器上使用
    close()

    关闭此播放器。当前播放的任何音频都会立即停止

    我觉得您需要关闭当前运行的
    Player
    对象(如果有),然后启动一个新的
    Player
    对象来播放新声音。如果要在多个线程中执行此操作,则需要执行以下操作:

  • 锁定一些
    最终对象锁定
    对象
  • 如果希望当前声音结束,请检查当前
    播放器
    对象(如果有)是否已通过
    睡眠
  • close()
    当前的
    Player
    对象,并创建一个新的
    Player
    ,如果您想消除当前的声音
  • 调用
    play()
    下一个mp3
  • 解锁锁定对象

  • 据我所知,
    play()
    方法并不等待声音播放,而是在将声音加载到音频缓冲区后立即返回。但是,我不确定如果音频文件很大会发生什么。

    Thread.stop()
    是一种不推荐使用的方法,不应使用。您可能会更幸运地使用或。扩展线程或实现Runnable。没有必要两者都做。关闭线程很可能不是立即停止声音的正确方法。Javazoom的播放器应该提供一些方法。如果没有,那就是他们的目标的缺陷。另外,播放器的每个实例可能都应该在自己的线程中,而不是试图重用。如果由多个线程访问,则需要将
    player
    设置为volatile
    Thread.stop()
    是一种不推荐使用的方法,不应使用。您可能会更幸运地使用或。扩展线程或实现Runnable。没有必要两者都做。关闭线程很可能不是立即停止声音的正确方法。Javazoom的播放器应该提供一些方法。如果没有,那就是他们的目标的缺陷。另外,播放器的每个实例可能都应该在自己的线程中,而不是试图重用。如果被多个线程访问,您需要将
    播放器
    设置为volatile
    。感谢您的回复。我尝试创建一个调用sound.close的函数,在需要更改声音时关闭。但是,