2013-02-08 4 views
0

매우 복잡한 Java 프로그램이 있습니다. 그것은 잘 작동합니다. 그러나 나는 그저 앱에 "Working"애니메이션을 인쇄하여 사용자가 반응이 좋다는 것을 알리려고합니다. 다음과 같은 코드로 간단한 클래스를 만들었습니다.다른 스레드에 있어도 콘솔 텍스트 출력이 차단되었습니다.

public class Working extends Thread { 
    private volatile boolean finished = false; 
    char[] animationChars = new char[] { '|', '/', '-', '\\' }; 
    int anim = 0; 

    public void finish() { 
     finished = true; 
    } 

    public void run() { 
     try { 
      while (!finishing) { 
       print(); 
      } 
     } catch (Exception e) { 
      // nothing here... 
     } 
    } 

    private void print() throws InterruptedException { 
     for (int i = 0; i < SLEEP_SECS; i++) { 
      System.out.print("\rWorking... " + animationChars[anim++]); 
      if (anim == 4) 
       anim = 0; 
      Thread.sleep(1000); 
     } 
    } 
} 

이 코드를 실행하면 처음에는 잘 동작합니다. 그러나 시간이 지남에 따라 애니메이션이 몇 초 동안 멈추는 경우도 있습니다. 이 코드를 다른 스레드로 옮기면이 문제를 해결할 수 있지만 보시다시피, 그렇지 않습니다!

내 프로젝트는 데이터베이스에 액세스하고 명령 줄 프로세스를 실행하며 많은 페이지를 다운로드합니다. 이 문제의 원인은 무엇입니까? 나는 뭔가를 놓치고 있거나 자바 같은 간단한 작업을 처리 할 수 ​​없습니다.

+0

왜 for 루프를 덤프하지 않습니까? 당신은 단순히'anim' 값을 증가시키고, 텍스트를 표시하고'run' 메소드로 되돌아 갈 수 있습니다 ... 당신은 다른 작업도 많은 양의 CPU 사이클을 소비하고, 모든 연산을 느리게 할 수 있으며, 실행중인 시스템 일 수 있습니다 GC 사이클 ... – MadProgrammer

+0

코드는 단순화되었습니다. 나는 그 부분을 제거했다. 그러나 단지 데이터를 출력합니다. 내 다른 작품은 CPU의 2 %를 소비하고 2GB 메모리로 시작하지만 내 앱은 최대 15GB의 RAM을 사용할 수 있으며 시작한 후 몇 초가 걸립니다. –

+0

@MadProgrammer이 응용 프로그램은 강력한 CPU가 장착 된 24GB RAM의 서버에서 실행됩니다. 시스템 리소스는 문제가되지 않습니다. JDK의 프로파일 러를 사용하여 앱을 모니터링했습니다. –

답변

0

전 gc가 일부 메모리를 비우는 것을 막을 수 있기 때문에 이러한 중지가 전체 gc 중에있는 것으로 의심됩니다 (parellel gc를 사용하지 않는 경우). gc 로그를 확인해야합니다.

+0

GC가 너무 많이 발생합니다. 또한, 위의 내 의견을 읽어주십시오 –

관련 문제