我有以下代码:
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等待此操作具有高优先级,并且在完成之前不应该终止它?感谢。
答案 0 :(得分:2)
有关关闭钩子的建议必须使用大量的盐。关闭钩子是最后的手段设备,您可以尝试通过任何其他方式挽救您无法做到的事情。您不能依赖任何正常的假设,例如System.out
仍处于打开状态,您的日志文件仍处于打开状态,即使文件系统可用,依此类推。
关闭钩子的用例是尝试优雅地关闭获取的资源,而不尝试进一步的数据传输。
您应该采取的方法是:
告诉自己LibreOffice给你的确切条款:你是否有一定的超时时间来完成你的工作?
在任何时间点最小化待处理的工作,从而最大限度地提高在超时内完成工作的机会。
答案 1 :(得分:0)
你可以使用。
Runtime.getRuntime().addShutdownHook(Thread);
关机挂钩将是最好的选择。