Как заставить поток реагировать на нажатие кнопки в другом потоке
Суть такова: требуется повесть на нажатие пробела звук удара, пауза на 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();
}
}
}