繁体   English   中英

在控制台上管理多个线程

[英]Managing multiple threads at the console

当我运行多个线程时,我在System.out.println输出中迷路了,因为我想每个线程都必须位于不同的控制台中。

有没有使用Eclipse管理它的简便方法?

编辑:问题是不知道哪个消息属于每个线程。 确切的问题是,在调用新线程时,控制台将停止打印,并且log4j也会发生同样的情况。

我建议您切换到比System.out.println更好的日志记录工具, log4j是一种流行的选择。

如果您不想为此目的包括另一个库,建议您

  • 给所有线程有意义的名称(请参阅Thread.setName
  • 将日志语句包装在您自己的静态日志记录函数中
  • 在输出的每一行之前添加Thread.currentThread().getName()前缀。

如果您认为这太“具有侵略性”或正在处理旧代码 ,则可以创建自己的PrintStream ,该PrintStream将每个参数以当前线程名称(如上)作为println前缀,然后执行System.setOut(new YourThreadLoggingPrintStream());

您可以使用log4j并为每个线程设置一个不同的Logger,将每个Logger连接到不同的Eclipse视图,但这将在您的应用程序中进行大量配置和大量编码。 另外,如果您只是将线程ID和消息一起记录下来,那么即使所有线程都登录到同一视图,也可以知道打印出了哪个线程。

如果使用log4j,则可以使用嵌套诊断上下文使线程的日志记录保持一致。

这是log4j手册中对NDC的描述:

大多数实际系统必须同时处理多个客户端。 在这种系统的典型多线程实现中,不同的线程将处理不同的客户端。 日志记录特别适合跟踪和调试复杂的分布式应用程序。 区分一个客户端的日志记录输出与另一个客户端的日志记录输出的通用方法是为每个客户端实例化一个新的单独的日志记录器。 这促进了记录器的扩散,并增加了记录的管理开销。

一种更轻松的技术是唯一标记从相同客户端交互发起的每个日志请求。 尼尔·哈里森(Neil Harrison)在R. Martin,D。Riehle和F. Buschmann(Addison-Wesley,1997年)编辑的《程序设计3的模式语言》一书中的“记录诊断消息的模式”中描述了这种方法。

为了唯一标记每个请求,用户将上下文信息推送到NDC中,Nested Diagnostic Context(嵌套诊断上下文)的缩写。 NDC类如下所示。

 public class NDC { // Used when printing the diagnostic public static String get(); // Remove the top of the context from the NDC. public static String pop(); // Add diagnostic context for the current thread. public static void push(String message); // Remove the diagnostic context for this thread. public static void remove(); } 

每个线程将NDC作为上下文信息的堆栈进行管理。 请注意,org.apache.log4j.NDC类的所有方法都是静态的。 假设NDC打印已打开,则每次发出日志请求时,适当的log4j组件将在日志输出中包括当前线程的整个NDC堆栈。 无需用户干预即可完成此操作,用户仅负责通过在代码中几个明确定义的点使用push和pop方法将正确的信息放置在NDC中。 相反,每客户记录器方法命令在代码中进行大量更改。

为了说明这一点,让我们以servlet向众多客户端传递内容的示例为例。 servlet可以在执行其他代码之前,在请求的开始处构建NDC。 上下文信息可以是客户端的主机名以及请求所固有的其他信息,通常是cookie中包含的信息。 因此,即使Servlet同时为多个客户端提供服务,由于每个客户端请求将具有不同的NDC堆栈,因此仍可以区分由相同代码(即属于同一记录器)发起的日志。 与此相反,将新实例化的记录器传递给客户请求期间执行的所有代码的复杂性却与此相反。

我刚刚配置为将所有日志写入文件中。

<appender name="rolling-file" class="org.apache.log4j.RollingFileAppender">
        <param name="file" value="home/.../mylog.log" />
        <param name="MaxFileSize" value="1000KB" />
<!--        Keep one backup file -->
        <param name="MaxBackupIndex" value="4" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d [%t] %-5p %l - %m%n" />
        </layout>
</appender>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM