【发布时间】:2014-01-27 17:02:10
【问题描述】:
我有以下代码:
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 等待这个操作是高优先级的,它不应该在完成之前终止?
【问题讨论】:
-
关闭钩子是最好的方法 - 你不能强制它们一直工作,但总的来说,它们是你完成这项工作的最佳工具.
-
如果您知道如何检测代码中的关机信号...究竟是什么问题?
-
问题是即使 LibreOffice 说它正在关闭,它也不会等待代码来做一些事情,比如关闭文件、释放资源......这就是为什么我问是否在这段代码完成之前,有一种方法可以让 JVM 保持活动状态。
标签: java multithreading libreoffice