等待线程在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中写入更改的主要内容,如果未能解决你的问题,请参考以下文章

让线程等待值在内存中更改的有效方法?

ShutdownHook作用

ShutdownHooks源码详解

如何将数据写入stdin以供等待stdin输入的单独线程使用?

Springboot Java多线程操作本地文件,加读写锁,阻塞的线程等待运行中的线程执行完再查询并写入

如何在消费者线程中组织等待来自主线程的数据