2015-09-01 38 views
3

我正在寫java程序,它創建不同的由某人給出的Runnable對象的不同實例,然後運行它們。例如,用戶給我一個帶有可運行類的.class文件,並創建該對象的實例並運行它。一切工作正常,直到我決定監視每個不同線程的進度。可以說當前的Runnable對象在控制檯中打印1到9之間的所有數字。我想捕捉那個輸出並將它作爲一個String返回。使用System.setOut(..)阻止我使用控制檯,所以它不是一個選項。監視(日誌)不同線程的執行

回答

3

使用setOut不會阻止您使用控制檯,如果先保存它,並且除非使用字節代碼檢測,否則它是唯一的選項。

static final PrintStream OUT = System.out; 
static { 
    // capture all System.out 
    System.setOut(new MyPrintStream()); 

    OUT.println("Print as normal"); 
} 

class MyPrintStream extends PrintStream { 
    final ThreadLocal<StringBuilder> text = ThreadLocal.withInitial(() _> new StringBuilder()); 

    public void print(String s) { 
     StringBuilder sb = text.get(); 
     sb.append(s); 
    } 

    public void println(String s) { 
     StringBuilder sb = text.get(); 
     sb.append(s).append('\n'); 
     // do something with sb. 
    } 
+1

唉,這是相當整潔的解決方案,我沒有想到我的問題。謝謝:) –

+1

@miroslavlalev可以投票給我回答如果你喜歡。 –

+1

@miroslavlalev我已經添加了如何使用ThreadLocal來收集每個線程的輸出。 –