Как заставить поток реагировать на нажатие кнопки в другом потоке

Суть такова: требуется повесть на нажатие пробела звук удара, пауза на 500 мсек, звук реакции

В классе Sounds запускаю плееры. В главном потоке они работают, воспроизводят звук исправно.

Далее я запускаю поток, где проверяю булевую переменную isHit. Булевая переменная меняет свое состояние по нажатию на пробел. Это происходит в главном потоке.

Нажатия, звучания оттестированы и точно работают. Не работают лишь в потоке soundThread. Во всем коде три потока: главный, поток для фоновой музыки и вот этот. Переменная private static volatile boolean hit; Сеттер и геттер synchronized.

Если делать в главном потоке, появляются фризы игры, что меня не устраивает. Если без слипа, звук реакции накладывается на звук удара и полкучается какафонияю.

Решать задачу методом корректировки звука считаю неправильно, потому как, возможно, потребуется в следующий раз прокрутить звук сильно длиннее так, чтобы он бормотал по наступлению события и все вокруг не замирало в ожидании. То есть, в другом потоке.

Код:

import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import java.io.File;

public class Sounds {

    File hit = new File("src/sounds/Hit.wav");
    File pain = new File("src/sounds/pain.wav");

    void soundHit() {
        try {
            AudioInputStream ais = AudioSystem.getAudioInputStream(hit);
            Clip clip = AudioSystem.getClip();
            clip.open(ais);
            clip.setFramePosition(0);
            clip.start();
            ais.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    void soundPain() {
        try {
            AudioInputStream ais = AudioSystem.getAudioInputStream(pain);
            Clip clip = AudioSystem.getClip();
            clip.open(ais);
            clip.setFramePosition(0);
            clip.start();
            ais.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

public class SoundThread implements Runnable {
    Thread soundThread = new Thread(this);
    Sounds sounds = new Sounds();

    @Override
    public void run() {
        if (Player.isHit()) {
            sounds.soundHit();
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            sounds.soundPain();
        }
    }
}

Ответы (0 шт):