Здесь:
public static int index = 0; // The current clip playing
Это поле индекса используется и обновляется несколькими потоками. Это значит: все может случиться.
Первый шаг: используйте AtomicInteger вместо int
здесь.
И реальный ответ, конечно: вы должны исследовать, что вы делаете. Просто добавьте new Thread().start()
здесь или там без знания и понимания того, что вы делаете, - не что иное, как рецепт столкнуться со всеми видами непредсказуемого поведения. Это очень просто: когда изменяемые данные совместно используются между несколькими потоками, тогда вы абсолютно должны обеспечить соблюдение необходимых мер предосторожности.
Чтобы дать немного больше указаний: запретить такие вещи, как if (index < 0) index = 0;
, чтобы включить гонки .
Значение: один поток видит, например, index = 1, а затем устанавливает индекс в 0. Но в то же время другой поток пытался прочитать индекс и использовал неправильное промежуточное содержимое.
Когда вы превращаете этот индекс в AtomicInteger
, вы можете начать делать такие вещи, как:
synchronized(index) {
if (index ...
index = ...
}
например.