Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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 JLayer暂停并恢复_Java_Multithreading_Audio_Mp3_Jlayer - Fatal编程技术网

Java JLayer暂停并恢复

Java JLayer暂停并恢复,java,multithreading,audio,mp3,jlayer,Java,Multithreading,Audio,Mp3,Jlayer,我刚开始使用Jlayer库来播放MP3。它工作得很好,我能演奏这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让我播放MP3的线程等待,声音就会停止,为了恢复歌曲,我只需通知线程。以下是我得到的: import java.util.Scanner; import java.io.BufferedInputStream; import java.io.FileInputStream; import javazoom.jl.player.Player; public

我刚开始使用Jlayer库来播放MP3。它工作得很好,我能演奏这首歌。我唯一的问题是实现暂停和恢复方法。由于我对多线程的了解有限,我认为让我播放MP3的线程等待,声音就会停止,为了恢复歌曲,我只需通知线程。以下是我得到的:

import java.util.Scanner;

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

import javazoom.jl.player.Player;

public class MP3 extends Thread{
    private String filename;
    private Player player; 
    private Thread t;
    private volatile boolean continuePlaying = true;

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

    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);
        }

    }

    public void run() {
        play();

            try { 
                while (true) { 
                    synchronized(this) {
                    while(!continuePlaying)
                        wait();


                    player.play();
                    }

                }
            }
            catch (Exception e) { 
                System.out.println(e);

        }

    }



    private void pause() throws InterruptedException{

            System.out.println("Pause");
            continuePlaying = false;



    }

    private void resumeSong() throws InterruptedException{
        synchronized(this) {
            System.out.println("Resume");
            continuePlaying = true;
            notify();

        }
    }

    // test client
    public static void main(String[] args) throws InterruptedException{
        String filename = ("Fall To Pieces.mp3");
        MP3 mp3 = new MP3(filename);
        mp3.start();

        Scanner s = new Scanner(System.in);
        s.nextLine();

        mp3.pause();

        s.nextLine();

        mp3.resumeSong();


        try {
        mp3.join();
    } catch (Exception e){
    }
    }

}
然而,出于某种原因,wait不起任何作用,程序甚至无法到达notify。为什么会这样


我已经阅读了前面关于这方面的问题,但我还没能让它们起作用。我还对学习为什么这段代码不起作用感兴趣,以便进一步理解多线程。谢谢大家!

这里很晚了,请原谅我看错了你的密码。但在我看来,你的线程从continueplay=true开始;run方法只调用play;没有初始化新玩家,然后直接进入一个真正的循环,它必须退出点。持续播放不能被仍然卡在无限循环中的线程更改,即使您启动另一个MP3线程访问volatile变量,它也会在能够更改任何内容之前进入相同的循环。因此,等待永远不会到来。 稍后,您将尝试从其内部通知等待的线程。这有点自相矛盾,因为它在等待被通知,处于等待什么都不做的状态,更不用说通知自己了。在通知之前,它不能做任何事情,包括通知自己或其他人。我想说的是,您应该处理wait,但特别是从正在寻址/等待的线程外部通知

另外你的player.play;他的处境很奇怪。此时,玩家只应在线程暂停后开始播放。至少等待一次,因为线程已延迟!连续铺设条件


因此,对于您的情况,我会使用不同线程中的方法,甚至是测试的主线程中的方法,这些方法调用wait和notify on,并通过相关线程进行同步。

哦,我明白了。这是我第一次使用线程,所以我想你是对的。然而,我的问题是如何在不使用while循环的情况下使线程保持活动状态?另外,如果我无法更改布尔值,如何临时挂起线程?@amb110395为什么要根据线程中的变量挂起线程?有什么反对打mp3的吗;而不是mp3.pause和notify保持同步?此外,你不需要一个永久的循环来保持你的线程的活力。像任何其他对象一样,只要它有一个活动引用,它就应该是好的,这个引用就是变量mp3。是的,我做了一些类似的事情,它就工作了。无论如何,谢谢您解决方案就在这里: