如何在线程中关闭FileHandlers?

时间:2012-05-15 09:04:46

标签: java multithreading java.util.logging filehandler

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

  1. 有什么问题?
  2. 如果我在eclipse中强制终止执行,我还可以处理它吗?
  3. 我的代码如下:

    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) {}
            }
        }
    }
    

1 个答案:

答案 0 :(得分:2)

由于你是使用addHandler()添加处理程序,所以clean方法是close()然后调用removeHandler()

See removeHandler

另外,从上面链接复制:

  

通过这个初始(便宜)测试后,Logger将分配一个   LogRecord描述日志消息。然后它将调用过滤器   (如果有的话)对记录是否应该进行更详细的检查   出版。如果通过它将然后将LogRecord发布到它   输出处理程序。 默认情况下,记录器也会发布到其父级   处理程序,递归树上

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