繁体   English   中英

如何从不同的线程使用java.util.logging.Logger?

[英]How to use java.util.logging.Logger from different threads?

我正在使用JTextArea开发一个简单的swing应用程序,以显示来自整个应用程序的日志消息。 为了开发该应用程序,我使用了MVC模式的简化版本,其中在两个方向上的视图和模型之间插入了控制器:

  • 当用户与挥杆控件进行交互时,如果这种交互需要访问模型(也就是说,它需要读取和/或编写模型),则挥杆控件引发的事件需要一种合适的控制器方法;
  • 当应该更新视图时,控制器将调用视图的一种或多种方法。

几乎所有异常都在控制器中捕获,并发送到java.util.logging.Logger ,如以下代码片段所示。

public void onWriteFile() {
    try {
        // ...
    }
    catch(IOException ex) {
        Logger.getLogger(Controller.class.getName()).log(Level.SEVERE, "onWriteFile()", ex);
    }

    view.refresh(...);
}

在定制的图形组件中仅捕获以下异常,并将其发送到记录器(我从清单6中的示例中学到了灵感。Java理论和实践的 健壮的侦听器调用 :成为一个出色的(事件)侦听器 )。

private synchronized void processDrawingEvent(DrawingEvent e) {
    if (e == null) {
        return;
    }

    for (Iterator<DrawingListener> i = listeners.iterator(); i.hasNext();) {
        DrawingListener listener = i.next();
        try {
            switch (e.getStatus()) {
                case DRAWING:
                    listener.drawing(e);
                    break;
                case DONE:
                    listener.done(e);
                    break;
                case DELETED:
                    listener.deleted(e);
                    break;
                }
        } catch (RuntimeException ex) {
            i.remove();
            Logger.getLogger(ImagePanel.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

当前,对Logger.log(...)方法的所有调用都来自同一线程。 然而,如果这种方法是由不同的线程调用,我应该使用的溶液等这样

这取决于您要在此处解决的问题。

从代码正确性的角度来看,您无需执行任何特殊操作即可在多个线程之间共享同一Logger对象。 该类是线程安全的。

您链接到的Q&A正在解决另一个问题。 即如何通过将日志记录与写入日志文件脱钩来防止日志记录I / O成为性能瓶颈。

如果你试图避免记录瓶颈,那么它是欢颜考虑那种做法。 但是,在您的情况下,日志消息的异步处理还有其他一些问题:

  • 由于您正在将日志消息写入屏幕,因此,如果使该消息异步,则用户看到的日志消息可能会落后于实际发生的情况。 确实,如果有很多日志事件,则延迟可能会很大。 海事组织,这是不希望的。

  • 如果日志事件发生率太高,那么异步处理最终将“备份”,并且日志记录成为瓶颈。

  • 写入屏幕比写入文件要昂贵得多。 在Java和窗口管理器中,以及(最终)与Java进行交互以将像素显示在屏幕上的I / O设备中,它涉及到更多的CPU和I / O。 (例如,滚动...)这意味着如果您登录到屏幕而不是文件,则可以保持低得多的日志记录速率。

暂无
暂无

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

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