我正在编写 Java 程序来创建某人提供的 Runnable 对象的不同实例,然后运行它们。例如,用户给我一个带有可运行类的 .class 文件,我创建该对象的实例并运行它。一切正常,直到我决定监视每个不同线程的进度。假设当前 Runnable 对象在控制台中打印从 1 到 9 的所有数字。我想捕获该输出并将其作为字符串返回。使用 System.setOut(..)
会阻止我使用控制台,因此这不是一个选项。
最佳答案
使用 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.
}
关于java - 监控(记录)不同线程的执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32332170/