Методы печати, не вызываемые при запуске, вызываемые при отладке - PullRequest
0 голосов
/ 04 мая 2009

Я создал класс с четырьмя методами. Я вставил в них операторы печати, чтобы понять, правильно ли они работают. С первыми тремя проблем нет. Но когда я вызываю четвертый метод, ничего не печатается. Как ни странно, когда я запускаю отладчик и пошагово перебираю метод, операторы вызываются (и выводятся на печать). Как это может быть?

Заранее спасибо.

Метод, о котором идет речь:

   public void robin(int counter, int quant, int penalty) {

   if(Schedulers.quant==-1) {
      Schedulers.quant=quant;
   }


   while(p!=null && p.getArrival()==counter) {
       qrobin.add(p);

       if(i.hasNext())
           p=i.next();
       else {
           p=null;
           break;
       }
    }

   if(active!=null) {
       if(active.getLeftOver()>0 && Schedulers.quant>0) {
           active.decreaseLeftOver();
           Schedulers.quant--;
           System.out.print(active.getPID());
       }
       else if(active.getLeftOver()>0 && Schedulers.quant==0) {
           qrobin.add(active);
           active=qrobin.poll();

           Schedulers.quant=quant;
           Schedulers.quant--;

           if(active!=null) {
               System.out.print(active.getPID());
               active.decreaseLeftOver();
           }
           else
               System.out.print(" ");

       }
       else {
           active=qrobin.poll();

           Schedulers.quant=quant;
           Schedulers.quant--;


           if(active!=null) {
               System.out.print(active.getPID());
               active.decreaseLeftOver();
           }
           else
               System.out.print(" ");

       }
   }
   else {
       active=qrobin.poll();

       Schedulers.quant=quant;
       Schedulers.quant--;

       if(active!=null) {
          System.out.print(active.getPID());
          active.decreaseLeftOver(); 
       }
       else
           System.out.print(" ");
   }

}

Код, вызывающий это:

while(true){

        algorithm(algorithm,s,counter);

        counter++;
    }

Ответы [ 5 ]

1 голос
/ 04 мая 2009

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

Способ решения такого необъяснимого поведения заключается в максимально возможном сокращении кода при сохранении указанного поведения, то есть уберите весь код, который, по-видимому, не связан с ним, проверьте, сохраняется ли проблема; если это не так, добавьте часть кода обратно и т. д. В конце концов вы сможете определить изменение, которое вызывает проблему, и определить, что на самом деле происходит оттуда.

0 голосов
/ 04 мая 2009

Хорошо, если ваша активная переменная имеет нулевое значение все время, вы будете печатать только "", так что вы можете не заметить ее в выходных данных консоли. Это может быть проблема синхронизации, которая делает активным не быть нулевым, когда вы запускаете в отладке.

0 голосов
/ 04 мая 2009

Когда вы «запускаете» код, как вы это делаете? Он «запускается» на каком-то сервере или контейнере, в который может быть перенаправлен стандартный вывод? Это то, что я подозреваю.

Использование System.out для отладки и устранения неполадок, подобных этому, может быть проблематичным и (в общем) довольно плохой практикой - лучше всего использовать каркас журнала, такой как log4j . Таким образом, вам не нужно угадывать, куда отправляется вывод журнала.

0 голосов
/ 04 мая 2009

Я не могу сказать что-либо окончательное, не видя остальную часть класса, и, возможно, некоторые другие классы, которые он использует, но похоже, что это может быть состояние гонки, то есть несколько потоков, которые непредсказуемым образом мешают друг другу , Особенно многократное использование Schedulers.quant, по-видимому, несинхронизированной статической переменной, выглядит крайне подозрительно.

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

0 голосов
/ 04 мая 2009

Есть много причин для этого. Однако без дополнительной информации вам почти невозможно помочь.

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