监控(记录)不同的线程'执行

时间:2015-09-01 12:52:24

标签: java

我正在编写java程序,它创建由某人给出的Runnable对象的不同实例,然后运行它们。例如,user给我一个带有runnable类的.class文件,我创建该对象的实例并运行它。一切正常,直到我决定监控每个不同线程的进度。让我们说当前的Runnable对象在控制台中打印从1到9的所有数字。我想捕获该输出并将其作为String返回。使用System.setOut(..)阻止我使用控制台,因此它不是一个选项。

1 个答案:

答案 0 :(得分: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.
    }