java - 如何关闭线程中的FileHandlers?

标签 java multithreading java.util.logging filehandler

我想在线程完成或强制完成后关闭所有 FileHandler
我创建了一个 closeLogger 函数,但似乎没有被调用
因为我看到该文件仍然锁定在文件夹中。

  1. 问题是什么?
  2. 在eclipse中强行终止执行也可以处理吗?

我的代码如下:

public class Passenger extends Thread {

    private Logger logger;

    public Passenger() throws SecurityException, IOException, InterruptedException {
        logger = Logger.getLogger(String.format("Passenger%sLogger", name));
        FileHandler fileHandler = new FileHandler(String.format(".\\Logs\\PassengerLogs\\passenger_%s.txt", name), true);
        fileHandler.setFormatter(new LogFormatter());
        logger.addHandler(fileHandler);
    }

    @Override
    public void run() {
        try {
            goToStation();
            waitForTaxi();
            if (passengerState == PassengerState.WatingInQueue) {
                goHome();
            } else { // already in taxi
                synchronized (this) {
                    wait();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            closeLogger();
        }
    }

    private void closeLogger() {
        Logger logger = getLogger();
        java.util.logging.Handler[] handlers = logger.getHandlers();
        for (java.util.logging.Handler h : handlers) {
            try {
                h.close();
            } catch (SecurityException e) {}
        }
    }
}

最佳答案

由于您使用 addHandler() 添加处理程序,干净的方法是 close() 然后调用 removeHandler()

See removeHandler

另外,从上面的链接复制:

After passing this initial (cheap) test, the Logger will allocate a LogRecord to describe the logging message. It will then call a Filter (if present) to do a more detailed check on whether the record should be published. If that passes it will then publish the LogRecord to its output Handlers. By default, loggers also publish to their parent's Handlers, recursively up the tree.

因此,如果您不删除处理程序,它仍然会保留引用。这可能是您的文件仍然被锁定的原因。试试这个,让我知道它是否有效!

关于java - 如何关闭线程中的FileHandlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10597447/

相关文章:

java - 配置 Spring MVC Controller 以将文件发送到客户端

java - Rx java 内存不足

c++ - 以编程方式查找机器上的内核数

java - 如何在 docker 卷中保存 java.util.logging 输出

tomcat - 在运行时重新加载 tomcat 日志记录?

java - 正则表达式查找两个选项卡之间的文本(java pattens)

java - 我如何获得特定的 Jbutton 单击?

java - 无法让 PMD 5.2.1 检查 JSP 文件?

c# - 多线程行为奇怪的 C#!

java - 在java logger的配置文件中指定自己的Formatter