gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:06:03 36 4
gpt4 key购买 nike

我正在开发一个简单的 swing 应用程序,它带有一个 JTextArea 来显示来自整个应用程序的日志消息。为了开发此应用程序,我使用了 MVC 模式的简化版本,其中 Controller 在两个方向上都介于 View 和模型之间:

  • 当用户与 swing 控件交互时,如果此交互需要访问模型(即需要读取和/或写入模型),则 swing 控件引发的事件会调用 Controller 的适当方法;
  • 当应该更新 View 时, Controller 调用 View 的一个或多个方法。

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

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

view.refresh(...);
}

只有以下异常会在自定义图形组件中被捕获并发送到记录器(我从 list 6. 强大的监听器调用 Java theory and practice: Be a good (event) listener 中的示例中获得灵感)。

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(...) 方法的调用都来自同一个线程。但是,如果此方法由不同的线程调用,我是否应该使用类似 this 的解决方案? ?

最佳答案

这取决于您要在这里解决什么问题。

从代码正确性的角度来看,您不需要做任何特殊的事情来跨多个线程共享同一个Logger 对象。该类是线程安全的。

您链接到的问答正在解决不同的问题;即如何通过将日志记录与写入日志文件分离来防止日志记录 I/O 成为性能瓶颈。

如果您试图避免日志记录瓶颈,那么考虑这种方法是值得的。但是,在您的情况下,日志消息的异步处理还有其他问题:

  • 由于您是将日志消息写入屏幕,如果您将其设为异步,用户看到的日志消息可能会滞后于实际发生的情况。事实上,如果有很多日志事件,延迟可能会相当大。 IMO,这是不可取的。

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

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

关于java - 如何从不同线程使用 java.util.logging.Logger?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150775/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com