java - 由于并发错误,服务器未正常关闭

标签 java concurrency grizzly

我有一个基于 Grizzly NIO 的简单服务器。我按如下方式启动/关闭它,请注意关闭方法附近的注释:

public class MyServer {

public static void main(String[] args) {
    try {

        HttpServer server = GrizzlyHttpServerFactory.createHttpServer(URI.create("someURL"), resourceConfig, false);
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            server.shutdownNow();
        }));

        server.start();
        Thread.currentThread().join();
        server.shutdown(); //this line is never reached
    } catch (IOException | InterruptedException ex) {
        //exception handling
    }
}
}

当我终止服务器时,它会立即关闭,因为永远不会到达 server.shutdown() 行,而不是优雅的方式。话虽如此,我尝试实现一个关闭 Hook ,但它也没有被调用。我怀疑我的 join() 实现,但不确定。任何有助于实现正常关闭的帮助将不胜感激。

最佳答案

Thread.currentThread().join() 将永远阻塞。它正在等待自己完成,但无法完成,因为它正在等待自己完成。

关于java - 由于并发错误,服务器未正常关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45523427/

相关文章:

java - 使用跨平台语言开发android有哪些缺点?

java.lang.IllegalStateException : getTransportChannel() called when needsExecutor() is true while using bigquery client library in dataflow

Jersey 2.0-m2 中的 JSON 支持

java - 在 Jersey 测试调用上设置查询参数

java - 读取 .txt 文件。我将如何读取整个字符串(忽略空格)并将其分配给变量?

java - 带 APR 的 Tomcat 仍然说 aprConnector 是假的

c++ - 如何允许多个线程访问 C++ 中匹配条件的临界区

c++ - 高效实现多线程排序算法的关键是什么?天真的实现不能正常工作

java - 获取锁对象线程正在等待

java - 如何在 Grizzly 嵌入式 Jersey 应用程序上获取 HTTP 请求方法?