2

FileHandlerスレッドが終了または強制的に終了したら、すべての s を閉じたいです。
関数を作成しました が、ファイルがまだフォルダー内でロックされているため、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) {}
        }
    }
}
4

1 に答える 1

2

addHandler() を使用してハンドラーを追加しているので、きれいな方法は close() してから removeHandler() を呼び出すことです

removeHandler を参照

また、上記のリンクからコピー:

この最初の (簡単な) テストに合格すると、Logger はログ メッセージを記述する LogRecord を割り当てます。次に、フィルター (存在する場合) を呼び出して、レコードを公開する必要があるかどうかについてより詳細なチェックを行います。これに合格すると、LogRecord がその出力ハンドラに発行されます。デフォルトでは、ロガーは親の Handler にもパブリッシュし、再帰的にツリーを上ります

したがって、ハンドラーを削除しない場合でも、参照は保持されます。これが、ファイルがまだロックされている理由である可能性があります。これを試して、うまくいくかどうか教えてください!

于 2012-05-15T14:45:44.217 に答える