强制JVM在终止之前完成代码块

时间:2014-01-27 17:02:10

标签: java multithreading libreoffice

我有以下代码:

public class LogWriter implements Runnable {
private static BlockingQueue<LogRecord> logQueue;

static {
    logQueue = new ArrayBlockingQueue<LogRecord>(30);
}

@Override
public void run() {
    Integer errorNo = 0;
    configureLogger();

    while (true) {
        try {
            LogRecord record = logQueue.take();
            consumeLogRecord(record);
            System.out.println(++errorNo + " - Logged error in file '" + LoggerConfig.LOG_PATH + "'");
            record = null;
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
    }
}
}

这是用Java编写的LibreOffice插件的记录器的一部分。当LibreOffice关闭时,它只会杀死它的插件(我到目前为止可以告诉它,不确定),但是在向它们发送信号之前它没有关闭,我可以在我的代码中检测到(通过UNO API) 。从LibreOffice收到终止信号后,我想将我的LogRecord队列刷新到日志文件,并将while(true)更改为false,这样方法run()可以适当地完成,释放它拥有的资源。所以我的问题是,如何告诉JVM等待此操作具有高优先级,并且在完成之前不应该终止它?感谢。

2 个答案:

答案 0 :(得分:2)

有关关闭钩子的建议必须使用大量的盐。关闭钩子是最后的手段设备,您可以尝试通过任何其他方式挽救您无法做到的事情。您不能依赖任何正常的假设,例如System.out仍处于打开状态,您的日志文件仍处于打开状态,即使文件系统可用,依此类推。

关闭钩子的用例是尝试优雅地关闭获取的资源,而不尝试进一步的数据传输。

应该采取的方法是:

  1. 告诉自己LibreOffice给你的确切条款:你是否有一定的超时时间来完成你的工作?

  2. 在任何时间点最小化待处理的工作,从而最大限度地提高在超时内完成工作的机会。

答案 1 :(得分:0)

你可以使用。

Runtime.getRuntime().addShutdownHook(Thread);

关机挂钩将是最好的选择。