Java-программа работает только с точками останова в Netbeans - PullRequest
0 голосов
/ 24 февраля 2010

Я работаю над многопоточной программой на Java, которая использует общий массив для передачи данных между потоками. Он разрабатывается в Netbeans 6.7.1.

Кажется, что один из потоков работает, только когда в нем установлена ​​точка останова, не имеет значения, где он находится.

Запуск в режиме отладки без точек останова действует так же, как запуск в выпуске - ожидаемый вывод никогда не поступает.

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

Как мне узнать, где и почему возникает эта проблема?

Пример кода:

result = utils.isBufferFull(AudioDuplex.voiceArray);
if(result == true) {
    System.out.println("Taking copy");

    voiceArray = AudioDuplex.voiceArray;//.clone();
    utils.clearBuffer(AudioDuplex.voiceArray);

 }

Если точка останова находится на строке 2, она никогда не срабатывает. Будет достигнута точка останова в строке 3, и будет получен ожидаемый результат.

Ответы [ 2 ]

1 голос
/ 24 февраля 2010

Невозможно точно сказать, что не так без более длинного примера кода, но по моему опыту, такое поведение типично для непризнанных проблем производитель-потребитель (см. http://en.wikipedia.org/wiki/Producer-consumer_problem).

По сути, вероятно, что поток вашего производителя не имеет доступных данных, когда поток потребителя запрашивает их. Основное решение - сохранить семафор (в java afaik есть класс Sempahore). Производитель будет публиковать, когда у него есть данные, потребитель будет ждать, пока производитель не запостит.

То, что вы видите с точкой разрыва, это то, что вы останавливаете потребительский поток на достаточно длительный период, чтобы производитель мог что-то предложить. Когда вы не ломаетесь, потребитель работает нормально и выходит до того, как у производителя что-нибудь получится.

1 голос
/ 24 февраля 2010

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

Ваша проблема, вероятно, связана с проблемой во время выполнения (второй поток обновляет задействованную переменную). Поскольку точки останова останавливают только активный поток, второй поток выполняет свою работу, поэтому код работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...