Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何等待HttpServer完成(即加入其后台线程)?_Java_Multithreading_Httpserver - Fatal编程技术网

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我改写了最后一段,谢谢你的提示。