0

我写了一个基本的java服务器类。当它处理“关闭”请求时,它会调用 server.stop(0) 并且旋转到位。为什么会这样?

我从这个 StackOverflow 帖子中复制了大部分代码。对这段代码的唯一重要修改是我添加了 server.stop(0)。

其他事实:我正在使用 java 8 运行它,我正在通过 IntelliJ 运行它。

package good.question.ask.questions.stackoverflow;

import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;

import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;

public class ServerTester2
{
    private HttpServer server = null;
    public static void main(String[] args) throws Exception {
    ServerTester2 serverTester2 = new ServerTester2();
    serverTester2.start();
}
void start()
{
    try {
        server = HttpServer.create(new InetSocketAddress(8000), 0);
    } catch (IOException e) {
        e.printStackTrace();
    }
    server.createContext("/shutdown", new MyHandler());
    server.setExecutor(null); // creates a default executor
    server.start();
}

class MyHandler implements HttpHandler
{
    @Override
    public void handle(HttpExchange t) throws IOException
    {
        String response = "This is the response";
        t.sendResponseHeaders(200, response.length());
        OutputStream os = t.getResponseBody();
        os.write(response.getBytes());
        os.close();
        t.close();
        System.out.println("Stopping Server...");
        stop();
        System.out.println("Server Stopped!");
    }
}

void stop()
{
    server.stop(0);
}
}

目前,服务器向客户端返回响应消息(我使用邮递员测试过),然后将“Stopping Server”打印到控制台。在那之后,服务器对象似乎被关闭了,因为当我向它发送更多请求时,它没有响应它们,但是,运行服务器的线程继续旋转。

最低限度,我希望服务器能够到达这行代码

System.out.println("Server Stopped!"); 

但它永远不会。

更重要的是,我希望服务器线程终止,但它只是旋转。

为什么会这样?(我在某处的代码中有死锁吗?)是否有更好的方法来处理服务器关闭(使用 httpserver 库)?

4

0 回答 0