我有一個非常複雜的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不能處理這樣一個簡單的任務。
爲什麼不轉儲for循環?你可以簡單地增加'anim'的值,顯示文本並返回到'run'方法......你的其他工作也可能消耗大量的CPU週期,減慢所有的操作,這可能是系統運行一個GC循環... – MadProgrammer 2013-02-08 23:39:11
代碼只是簡化。我從中刪除了一些部分。但它只是輸出數據。我的其他工作是消耗2%的CPU,並以2GB內存開始,但我的應用程序可能需要高達15 GB的RAM,並且在啓動它之後幾秒鐘就會發生。 – 2013-02-09 00:17:42
@MadProgrammer這個應用程序運行在具有強大CPU的24GB RAM的服務器上。系統資源不是問題。我使用JDK的分析器來監視應用程序。 – 2013-02-09 00:18:46