2009-05-04 4 views
0

4 가지 방법으로 클래스를 만들었습니다. 프린트 문을 삽입 했으므로 제대로 작동하는지 확인할 수있었습니다. 처음 세 개는 아무런 문제가 없습니다. 하지만 네 번째 방법을 부르면 아무것도 인쇄되지 않습니다. 이상하게도 디버거를 시작하고 단계별로 메서드를 이동하면 명령문이 호출되고 출력됩니다. 어떻게 이럴 수있어?인쇄 할 때 호출 할 때 인쇄 메서드가 디버깅 할 때 호출되지 않았습니다.

미리 감사드립니다. 문제

방법 :

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++; 
    } 
+2

코드를 보지 않고도 어떻게하면 우리가 무엇을 말할 것이라고 기대합니까? 수정 구슬을 사용하여? –

+0

문제가 무엇인지 알 수 있도록 코드를 게시해야합니다. – BobbyShaftoe

+0

일부 코드를 게시하십시오. – Naveen

답변

0

. 그러나 더 이상의 정보가 없으면 당신을 도울 수 없습니다.

0

클래스의 나머지 부분을 보지 않고서는 말할 것도없고, 다른 클래스를 사용하지 않고는 말할 수 없지만, 경쟁 조건, 예를 들어 예측할 수없는 상태로 서로 간섭하는 여러 스레드처럼 보입니다. 유행. 특히 Schedulers.quant의 다중 사용은 분명히 동기화되지 않은 정적 변수로서 매우 의심스러워 보입니다.

실제로 경쟁 조건 인 경우 this book을 읽고 다시 와서 코드를 수정해야합니다. 멀티 스레드 문제는 매우 복잡 할 수 있으며, 실제로 멀티 스레드 코드를 작성하기 전에 이론을 이해해야합니다.

+0

멀티 스레딩이 수반되지 않습니다. 지금은.보이는 모든 메소드가 다른 메소드에서 사용되고 있습니다. "quant"변수만이이 메서드에 고유하며 간단한 기본 정수형입니다. – ark

+0

특히 당황한 것은 디버거를 실행할 때 잘 작동한다는 것입니다. 이것은 나에게 완전히 비논리적입니다. – ark

+0

글쎄, 코드가 멀티 스레드로 실행되면 그 변수가 문제가 될 것이다. 메서드에 대해 "고유"한지 여부는 중요하지 않습니다. 중요한 것은 여러 스레드에서 액세스하고 동기화하지 않아도 "quant--"이 제대로 작동하지 않는다는 것입니다. –

1

확실한 답변이없는 것처럼 보이며 나머지 프로젝트가 없으면 문제를 재현하고 분석 할 수 없습니다.

설명 할 수없는 동작을 해결하는 방법은 상기 동작을 유지하면서 가능하면 코드를 줄이는 것, 즉 관련되지 않는 모든 코드를 제거하고 문제가 여전히 존재하는지 확인하는 것입니다. 그것이 아니라면 코드의 일부를 다시 추가하십시오. 결국에는 문제를 일으키는 변경 사항을 정확히 지적하고 거기에서 실제로 발생하는 것을 추론 할 수 있어야합니다.

0

코드를 "실행"할 때 어떻게 그렇게합니까? 표준 출력이 재 지정 될 수있는 일종의 서버 또는 컨테이너 내에서 "실행"됩니까? 이것이 제가 의심할만한 것입니다.

디버깅 및 문제 해결을 위해 System.out을 사용하면 문제가 발생할 수 있으며 (일반적으로) 꽤 나쁜 습관입니다. log4j과 같은 로그 프레임 워크를 사용하는 것이 가장 좋습니다. 이렇게하면 로그 출력이 전송되는 위치를 추측 할 필요가 없습니다.

0

활성 변수가 항상 null 인 경우 항상 ""인쇄하므로 콘솔 출력에 표시되지 않을 수 있습니다. 그것은 당신이 디버그에서 실행될 때 active가 null이되지 않도록하는 타이밍 문제 일 수 있습니다.

관련 문제