等待线程在shutdownhook中写入更改
Posted
技术标签:
【中文标题】等待线程在shutdownhook中写入更改【英文标题】:Wait for threads to write changes in the shutdownhook 【发布时间】:2011-12-15 09:56:13 【问题描述】:我有一个shutdownhook,它在进程终止时执行。但是,程序对 h2 数据库所做的更改不是持久的。只有在提交后让关闭线程等待一段时间,当我再次分层时,我才会看到数据库中的变化。
Runtime.getRuntime().addShutdownHook(new Thread()
@Override
public void run()
// H2 db add row, commit and close
Thread.sleep(1000); // in try/catch
System.out.println("Shutdown complete");
只有sleep
,下次连接数据库时我会看到更改。
有人知道如何在进程终止之前等待 H2 数据库完成操作吗?我想避免使用随机时间的Thread.sleep()
...
【问题讨论】:
【参考方案1】:您可以使用SHUTDOWN
命令在关闭应用程序之前正确刷新所有写入磁盘。
另一种解决方案是在关闭挂钩中调用CHECKPOINT SYNC
(但在关闭所有连接之前)。这不会“关闭”数据库,这应该在最后一个连接关闭时自动完成。
【讨论】:
【参考方案2】:你可以使用 Executors 移除 Thread.sleep(),使用它的 submit 方法提交一个 callable 的实例,然后使用 ExecuterServcie -awaitTermination() 方法或者你可以选择使用 CountDownLatch -countDown() 方法。参考CountDownLatch和ExecutorService
【讨论】:
以上是关于等待线程在shutdownhook中写入更改的主要内容,如果未能解决你的问题,请参考以下文章
如何将数据写入stdin以供等待stdin输入的单独线程使用?