На HttpServer, в чем разница между использованием Executor и Executor по умолчанию и реализацией параллелизма в обработчике Http? - PullRequest
0 голосов
/ 12 октября 2018

Я начал изучать HTTP-серверы в Java, и я видел примеры с обеими реализациями, с 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()
        }
    }

}
...