2013-02-08 25 views
0

我有一個非常複雜的Java程序。它工作正常。不過,我只想在應用程序中打印「工作」動畫,以讓用戶知道該應用程序是否響應。我創建了一個簡單的類有這樣的代碼:控制檯文本輸出被阻止,即使它在另一個線程上

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); 
     } 
    } 
} 

當我運行此,起初它工作正常。但隨着時間的推移,有些情況下動畫會停止幾秒鐘。我雖然將這段代碼移動到另一個線程會解決這個問題,但正如你所看到的,它並沒有!

我的項目訪問數據庫,運行命令行進程和下載頁面很多。什麼導致了這個問題?我錯過了什麼東西,或者是Java不能處理這樣一個簡單的任務。

+0

爲什麼不轉儲for循環?你可以簡單地增加'anim'的值,顯示文本並返回到'run'方法......你的其他工作也可能消耗大量的CPU週期,減慢所有的操作,這可能是系統運行一個GC循環... – MadProgrammer 2013-02-08 23:39:11

+0

代碼只是簡化。我從中刪除了一些部分。但它只是輸出數據。我的其他工作是消耗2%的CPU,並以2GB內存開始,但我的應用程序可能需要高達15 GB的RAM,並且在啓動它之後幾秒鐘就會發生。 – 2013-02-09 00:17:42

+0

@MadProgrammer這個應用程序運行在具有強大CPU的24GB RAM的服務器上。系統資源不是問題。我使用JDK的分析器來監視應用程序。 – 2013-02-09 00:18:46

回答

0

我會懷疑這些停止是在完整的gc期間,因爲完整的gc可能會阻止世界釋放一些內存(如果你不使用parellel gc)。 你應該檢查gc日誌。

+0

它發生太多是GC。另外,請閱讀我上面的評論 – 2013-02-09 00:16:30

相關問題