Код: Выделить всё
public void run() throws IOException {
new Thread(new Runnable() {
public void run() {
try {
System.out.println("--- start cons");
consumer.runConsumerThread();
System.out.println("--- done cons");
} finally {
synchronized (TrackFeeder.this) {
exit = true;
TrackFeeder.this.notifyAll();
}
}
}
}, "Audio Consumer").start();
< /code>
Когда ошибка не возникает, вывод из обеих этих распечаток появляется в терминале, где я запускаю программу, но безумно заключается в том, что в ситуации, где возникает ошибка , появляется только вторая распечатка . То есть я получаю < /p>
--- done cons
< /code>
в терминале, но нигде не «--- Start Cons». Как это возможно? Не берите в голову, что существует много резьбовых вещей, и, по -видимому, продолжается какое -то состояние раса: эти операторы явно выполняются в одном и том же потоке, один за другим, так как это возможно для вывода из second One появиться без первого появления перед ним? Конечно, существует выход для System.out
Моя платформа-Raspberry Pi с OpenJDK 17.0.13+11-Raspbian-2Deb12u1rpt1. Я запускаю один и тот же код на других машинах, но я наблюдал только ошибку, которую я преследую на PI. Феномен здесь, и, конечно, не ожидайте, что кто -то другой отладкует мой код, но на случай, если вы хотите проверить, что я делаю где -то еще, мой полный код здесь, под SRC/Java/Net/Avadeaux/Klipspringer/< /code> bullet, и файл, который я цитирую, is is trackfeeder.java.
update : я попытался добавить несколько счетчиков, чтобы увидеть, если println < /code> s на самом деле выполняется или каким -то образом пропущены. Итак, я добавил это в класс: < /p>
Код: Выделить всё
static int starts = 0, dones = 0;
System.out.println("--- start cons "+ ++starts +" "+ dones);
consumer.runConsumerThread();
System.out.println("--- done cons "+ starts +" "+ ++dones);
< /code>
Тогда я всегда получаю < /p>
--- start cons 1 0
--- done cons 1 1
< /code>
В выводе. «Старт» никогда не пропал. Так что это похоже на квантовую механику: состояние рушится, как это наблюдается. В любом случае, я понял, что проблема, с которой я на самом деле погоня (программа иногда преждевременно останавливается, если входной файл очень маленький), все еще не произойдет, без потерянного «старта», и я не уверен эти вещи даже коррелируют.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ut-be-lost