在控制台管理多个线程

时间:2011-08-18 13:42:28

标签: java multithreading eclipse debugging console

当我运行多个线程时,我会在System.out.println输出中丢失,因为我认为每个线程必须位于不同的控制台中。

有没有一种使用Eclipse管理它的简单方法?

编辑:问题是不知道哪个邮件属于每个帖子。确切的问题是控制台在调用新线程时停止打印,log4j也是如此。

4 个答案:

答案 0 :(得分:3)

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

如果您不想为此目的包含其他库,我建议您

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

如果您认为太“侵入性”或如果您正在处理遗留代码,则可以创建自己的PrintStream,其中每个参数前缀为println当前线程名称(如上所述)然后执行System.setOut(new YourThreadLoggingPrintStream());

答案 1 :(得分:1)

您可以使用log4j并为每个线程设置不同的Logger,将每个记录器连接到不同的Eclipse视图,但这将是您应用中的大量配置和大量编码。或者,如果您只是将线程ID与消息一起记录,那么即使所有线程都记录到同一视图,您也可以告诉打印出哪个线程。

答案 2 :(得分:1)

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

以下是来自the log4j manual的NDC的说明:

  

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

     

较轻的技术是对发起的每个日志请求进行唯一标记   来自相同的客户互动。尼尔哈里森描述了这种方法   在模式中的“用于记录诊断消息的模式”一书中   程序设计3的语言,由R. Martin,D。Riehle和F.编辑。   Buschmann(Addison-Wesley,1997)。

     

为了唯一标记每个请求,用户按下上下文信息   进入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打印   make,适当的log4j组件将包括整个NDC   在日志输出中为当前线程堆栈。这是没有的   用户的干预,只负责放置   通过使用a中的push和pop方法在NDC中更正信息   代码中几个明确定义的点。相比之下,每个客户   记录器方法命令对代码进行大量更改。

     

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

答案 3 :(得分:0)

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

<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>