Java 无法更改方法中的布尔值

Java 无法更改方法中的布尔值,java,methods,boolean,Java,Methods,Boolean,我有个小问题。我正在使用Java声音采样播放mp3,我想在单击按钮时停止播放。所以我想出了这样的办法: package sk.umb.osadnici.Client.Core.getterImages; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URL; import javax.sound.sampled.AudioFormat; import

我有个小问题。我正在使用Java声音采样播放mp3,我想在单击按钮时停止播放。所以我想出了这样的办法:

package sk.umb.osadnici.Client.Core.getterImages;

import java.io.File;
import java.io.IOException;

import java.io.InputStream;
import java.net.URL;

import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine.Info;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.sound.sampled.FloatControl;

import javazoom.jl.player.advanced.AdvancedPlayer;

import static javax.sound.sampled.AudioSystem.getAudioInputStream;
import static javax.sound.sampled.AudioFormat.Encoding.PCM_SIGNED;

public class GetterForBGMusic {
    private SourceDataLine line;
    private URL url;
    public URL bgUrl, bgUUUrl;
    private boolean canPlay = true;


    public void runMusic() {
        final GetterForBGMusic player = new GetterForBGMusic();
        player.play();
    }

    public void play() {
        URL inTTT = getClass().getResource("../sounds/bgMusic.mp3");

        try (AudioInputStream in = getAudioInputStream(inTTT)) {
            AudioFormat outFormat = getOutFormat(in.getFormat());
            Info info = new Info(SourceDataLine.class, outFormat);
            try (SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info)) {
                if (line != null) {
                    System.out.println(canPlay);
                    line.open(outFormat);
                    line.start();
                    stream(getAudioInputStream(outFormat, in), line);
                    line.drain();
                    line.stop();
                }
            }
        } catch (UnsupportedAudioFileException
                | LineUnavailableException
                | IOException e) {
            throw new IllegalStateException(e);
        }
    }

    private AudioFormat getOutFormat(AudioFormat inFormat) {
        final int ch = inFormat.getChannels();
        final float rate = inFormat.getSampleRate();
        return new AudioFormat(PCM_SIGNED, rate, 16, ch, ch * 2, rate, false);
    }

    private void stream(AudioInputStream in, SourceDataLine line)
            throws IOException {
        while (true) {
            System.out.println(this.getCanPlay());
        }
    }

    public void setCanPlay(boolean play) {
        this.canPlay = play;
    }

    public boolean getCanPlay() {
        return canPlay;
    }

    private void booleanValue() {
        while (true)
            System.out.println(canPlay);
    }
}
我正在使用这段代码,如果我在构造函数中调用booleanValue方法,一切都很好。但若在流内调用此方法,则值更改后并没有任何更改


或者有人能告诉我如何停止这一点:

您的程序是单线程的,这意味着它执行您从上到下编程的“命令”序列

比如说这个例子,

setCanPlay(true);
play(); //your for loop
setCanPlay(false);
setCanPlay(false)指令仅在for循环完成执行后执行

您需要的是让for循环在后台运行,并且能够在for循环运行时修改canPlay。这就是所谓的多线程,您应该在JavaAPI文档中查找Runnable、Task和Service类,以了解如何实现它

你会得到这样的结果:

setCanPlay(true);
play(); //your for loop, launched in another thread.
setCanPlay(false); // Executed while the for loop is running
这将立即开始和结束比赛


多线程是停止执行程序(从外部)的唯一方法。

您在哪里设置
布尔值以及如何设置?请在帖子中添加更多代码。我有getter/setter,我在swing中使用它。所有代码都在post+布尔值下面的链接中:)您永远不会调用
setCanPlay(布尔值)
。你能添加调用这个方法的代码吗?这是唯一的方法,看起来
canPlay
属性会从你这里的代码中改变。你能把你的swing代码发布到你调用setCanPlay的地方吗?我知道线程,但我还有一个问题。我将boolean设置为true,调用play()方法并创建新线程。但几秒钟后,我想停止这一点,不知道如何。我正在创建游戏,我有mp3文件的背景音乐,现在我正在做设置窗口,可以停止和播放背景音乐。所以现在//如果(boolean)play(),boolean是真的//新线程现在我在你的循环中有类似的东西,你可以检查变量是否设置为true。如果是这样,你就打破了循环。你应该去看看oracle trails教程,它们非常好。