java - 停止一个线程并启动另一个线程?

标签 java multithreading interrupt

我在停止一个线程并启动另一个线程时遇到问题。我创建了两个线程。其中之一是首先从 main 方法运行。然后它接受用户输入,如果提供了所需的输入,线程一(声音)应该停止并启动线程二(声音2)。从下面的代码来看,线程二在线程一提供正确的输入后开始播放。但线程一并没有停止。我可以听到线程一和线程二正在播放的音频文件。请帮忙。

public class crytask {

public static void main(String args[]) throws InterruptedException {
    Runnable sound = new sound();
    final Thread soundthread = new Thread(sound);

    soundthread.start();
    int count = 0;
        System.out.println("Enter");
        Scanner reader = new Scanner(System.in);
        int a = reader.nextInt();
        if (a==12)
        soundthread.interrupt();
        System.out.println("this thread is cancelled");

    Runnable sound2 = new sound2();
    final Thread soundthread2 = new Thread(sound2);
    soundthread2.start();
    int count2 = 0;
    System.out.println("Enter");
    Scanner reader2 = new Scanner(System.in);
    int b = reader2.nextInt();
    if (b==12)
    soundthread2.interrupt();

}}


class sound implements Runnable {
@Override
public void run() {     
    try {       
        AudioInputStream audioInputStream =       AudioSystem.getAudioInputStream(new File("/Users/babe/Desktop/Con1.wav").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream);
        clip.start();
        Thread.sleep(clip.getMicrosecondLength() / 1000);
    } catch(InterruptedException ex) {
        System.out.println("Cancelled 1!");
    } catch (Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}
}

class sound2 implements Runnable {
@Override
public void run() {     
    try {       
        AudioInputStream audioInputStream2 = AudioSystem.getAudioInputStream(new File("/Users/babe/Desktop/Con1.wav").getAbsoluteFile());
        Clip clip = AudioSystem.getClip();
        clip.open(audioInputStream2);
        clip.start();
        Thread.sleep(clip.getMicrosecondLength() / 1000);
    } catch(InterruptedException ex) {
        System.out.println("Cancelled 2!");
    } catch (Exception ex) {
        System.out.println("Error with playing sound.");
        ex.printStackTrace();
    }
}
}

最佳答案

尝试在线程中断时停止剪辑,将 clip.close() 添加到捕获 InterruptedException 的 catch 子句中,如下所示:

class sound implements Runnable {

    @Override
    public void run() {
        Clip clip = null; // take the declaration of the clip variable out of the try - catch
        try {       
            AudioInputStream audioInputStream =
                   AudioSystem.getAudioInputStream(new File("/Users/babe/Desktop/Con1.wav").getAbsoluteFile());
            clip = AudioSystem.getClip();
            clip.open(audioInputStream);
            clip.start();
            Thread.sleep(clip.getMicrosecondLength() / 1000);
        } catch(InterruptedException ex) {
            clip.stop(); // <--- ADD THIS LINE
            System.out.println("Cancelled 1!");
        } catch (Exception ex) {
            System.out.println("Error with playing sound.");
            ex.printStackTrace();
        }
    }
}

关于java - 停止一个线程并启动另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31689994/

相关文章:

java - JAX-WS SOAP Faults - 解析 SOAPFaultException 中错误的详细信息

Java - 添加两个不相等数组的内容

java - Glassfish 4中的JVM的星域问题

c++ - Win32 的单读者单作者队列

c - 通过核心中断在 alsa 中发出声音

java - JSF 2 复合 :actionSource exposing commandButtons in ui:repeat

multithreading - 如何从启动终端/线程中分离repl?

python - 多线程环境下python中kill挂起函数

linux - 关于中断和中断处理的问题

c - block 模式下的读取中断