我已经开始研究Java中的HTTP服务器,并且已经看到了两种实现的示例,它们都有一个HTTP服务器,并设置了一个Executor以同时处理多个请求,并且在处理HTTP请求的类内部有一个实现通过使用Threads或ThreadPools异步运行。
使用一个与另一个相比有什么优势吗?
import com.sun.net.httpserver.HttpExchange
import java.util.concurrent.Executors
import java.net.InetSocketAddress
import com.sun.net.httpserver.HttpServer
fun main(args: Array<String>) {
Thread {
HttpServerExampleWithExecutors()
}.start()
Thread {
HttpServerExampleWithThreadHandlers()
}.start()
}
class HttpServerExampleWithExecutors {
private val port = 8888
private val backlog = 50
init {
val server = HttpServer.create(InetSocketAddress(port), backlog)
server.createContext("/") { ex ->
MyHttpHandler(ex)
}
server.executor = Executors.newCachedThreadPool()
server.start()
println("Server Started on $port")
}
private class MyHttpHandler(ex: HttpExchange) {
init {
// Process request
Thread.sleep(5000)
val body = "<html>Hello World</html>"
ex.sendResponseHeaders(200, body.length.toLong())
ex.responseBody.write(body.toByteArray(charset("UTF-8")))
ex.requestBody.close()
ex.close()
}
}
}
class HttpServerExampleWithThreadHandlers {
private val port = 8889
private val backlog = 50
init {
val server = HttpServer.create(InetSocketAddress(port), backlog)
server.createContext("/") { ex ->
MyThreadedHttpHandler(ex)
}
// server.executor gets the default one
// private static class DefaultExecutor implements Executor {
// public void execute (Runnable task) {
// task.run();
// }
// }
server.start()
println("Server Started on $port")
}
private class MyThreadedHttpHandler(ex: HttpExchange) {
init {
val requestThread = Thread {
// Process request
Thread.sleep(5000)
val body = "<html>Hello World</html>"
ex.sendResponseHeaders(200, body.length.toLong())
ex.responseBody.write(body.toByteArray(charset("UTF-8")))
ex.requestBody.close()
ex.close()
}
requestThread.start()
}
}
}