我写了一个基本的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 库)?