我正在努力确保我的Java应用程序采取合理的步骤来保持健壮,其中一部分涉及优雅地关闭.我正在阅读有关关闭钩子的事情,我实际上并没有在实践中如何使用它们.
那里有一个实际的例子吗?
Let's say I had a really simple application like this one below, which writes numbers to a file, 10 to a line, in batches of 100, and I want to make sure a given batch finishes if the program is interrupted. I get how to register a shutdown hook but I have no idea how to integrate that into my application. Any suggestions?
package com.example.test.concurrency;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;
public class GracefulShutdownTest1 …Run Code Online (Sandbox Code Playgroud) 假设场景:
我有一个守护程序线程负责一些I/O,主线程完成并返回,JVM决定终止我的守护程序线程.
它是如何做到的?打断?最终确定?如何对我的守护程序线程进行编码,以便在终止时能够优雅地做出反应?
我正在使用Maven在并行类中运行多个JUnit测试.我有清理任务,需要在所有JUnit测试运行后发生.为了处理这个清理工作,我在一些测试中添加了一个关闭钩子.当我没有并行运行时,关闭挂钩正确执行,但是当我并行运行时,我没有看到关闭挂钩的输出(参见示例).有什么我做错了吗?System.exit在并行执行JUnit测试时,JVM是否退出使用?
根据Surfire文档文档,并行线程在同一进程中执行,因此我希望Runtime.getRuntime是相同的进程,即使它是在不同的测试和线程之间调用的. Maven Surfire插件 - 分叉选项和并行测试执行
使用parallel选项时要记住的重要事项是:并发发生在同一个JVM进程中.这在内存和执行时间方面是有效的,但您可能更容易受到竞争条件或其他意外且难以重现的行为的影响.
这是我单元测试的一个例子:
@Test
public void test()
{
Runtime.getRuntime().addShutdownHook(new Thread()
{
@Override
public void run()
{
System.out.println("Test clean up triggered");
}
});
}
Run Code Online (Sandbox Code Playgroud)
这是我的pom的相关部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.18.1</version>
<configuration>
<parallel>classes</parallel>
<threadCount>10</threadCount>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
编辑:
当我在@BeforeClass方法中添加关闭挂钩时,问题得到解决.当我在@Test方法中添加它时,我遇到了问题.我希望能够随时添加钩子.