在HttpServer上,使用Executor与使用默认Executor和在Http Handler中实现并发之间有什么区别?

时间:2018-10-12 12:14:17

标签: java concurrency kotlin httpserver

我已经开始研究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()
        }
    }

}

0 个答案:

没有答案