Java 我如何等待HttpServer完成(即加入其后台线程)?
我有以下代码:Java 我如何等待HttpServer完成(即加入其后台线程)?,java,multithreading,httpserver,Java,Multithreading,Httpserver,我有以下代码: 导入com.sun.net.httpserver.httpserver; ... 数据库连接dbConnection=。。。 HttpServer server=HttpServer.create(); createContext(“/endpoint”,新的MyHandler(dbConnection)); server.start(); //要等到“服务器”停止,我应该在这里做什么? dbConnection.close() 状态:“在新的后台线程中启动此服务器。” 我想在
导入com.sun.net.httpserver.httpserver;
...
数据库连接dbConnection=。。。
HttpServer server=HttpServer.create();
createContext(“/endpoint”,新的MyHandler(dbConnection));
server.start();
//要等到“服务器”停止,我应该在这里做什么?
dbConnection.close()
状态:“在新的后台线程中启动此服务器。”
我想在服务器的后台线程停止执行后调用dbConnection.close()
(这可能是因为我按了Ctrl+C)。但是HttpServer
文档没有指定任何访问后台线程的方法,因此我无法理解如何.join()
它
如何等待HttpServer的后台线程停止?或者有没有其他方法可以确保在我的应用程序关闭时调用dbConnection.close()
?有一种方法可以确保在Java进程终止时关闭dbConnection
:
Runtime.getRuntime().addShutdownHook(new Thread(() -> {
dbConnection.close();
}));
为了使用这种方法,dbConnection
必须是有效的final
,以便可以在lambda中捕获它。确保某些东西始终关闭的最佳方法是使用尝试资源
当代码块完成执行时,此构造将始终关闭提供给括号的任何Closeable
这里有一个例子
try(dbConnection) {
// do any sort of work inside this block.
}
dbConnection或Closeable将确保以这种方式关闭
利用资源进行尝试
服务器不会自行停止。你需要让它停下来。根据文档,有一种stop(int delay)
方法可以实现这一点
因此,您的问题应该是“如何在程序中等待,直到我告诉服务器停止?”
很少有选择:
- 等待用户按键。优点:非常简单。缺点:不能用于后台服务
- 等待Java进程退出(使用关闭挂钩);但是请注意,这并不是最好的,因为您对调用关闭挂钩的顺序控制有限,而且JVM可能会被硬终止,因此可能无法实现您想要的
- 等待其他一些外部事件-对特殊URL的请求、超时、操作系统信号、指定目录中指定文件的出现等
- 使用某种进程间通信(共享内存、命名管道、套接字、流、JMS等)与程序进行外部通信。通过这种方式,您可以创建一个单独的程序,该程序将连接到套接字并向服务器程序发送“退出”命令。当您在服务器程序中收到“EXIT”命令时,您将关闭服务器,关闭连接并退出main方法
最后一个选项是最好和最干净的,但它需要更多的工作。它也是非常通用的,因为您可以扩展命令集以包含其他有用的内容—重新加载服务器配置文件、在运行时添加或删除URL映射、获取服务统计信息等等。例如,Apache就是这样工作的。我不确定这在我的情况下是否有效。问题是无法判断代码何时完成执行,因为工作发生在后台线程中。因此,如果我替换//在此块内执行任何类型的工作。
使用server.start()
,它将在后台线程生成后立即退出该块,然后数据库连接将关闭,即使服务器仍在运行。无需将dbConnection声明为final,它实际上是最终的enough@lugiorgi我改写了最后一段,谢谢你的提示。