Mercurial Hosting > luan
changeset 1142:0f59eab45f3d
webserver - threading
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Tue, 30 Jan 2018 18:02:47 -0700 |
parents | 14927c34cbb7 |
children | 3bf5190b3c77 |
files | src/luan/webserver/Connection.java src/luan/webserver/Server.java |
diffstat | 2 files changed, 27 insertions(+), 20 deletions(-) [+] |
line wrap: on
line diff
--- a/src/luan/webserver/Connection.java Tue Jan 30 00:55:17 2018 -0700 +++ b/src/luan/webserver/Connection.java Tue Jan 30 18:02:47 2018 -0700 @@ -12,13 +12,16 @@ final class Connection { private static final Logger logger = LoggerFactory.getLogger(Connection.class); + static void handle(Server server,Socket socket) { + new Connection(server,socket).handle(); + } + private final Server server; private final Socket socket; - Connection(Server server,Socket socket) { + private Connection(Server server,Socket socket) { this.server = server; this.socket = socket; - handle(); } private void handle() {
--- a/src/luan/webserver/Server.java Tue Jan 30 00:55:17 2018 -0700 +++ b/src/luan/webserver/Server.java Tue Jan 30 18:02:47 2018 -0700 @@ -3,6 +3,9 @@ import java.io.IOException; import java.net.Socket; import java.net.ServerSocket; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,8 +15,7 @@ public final int port; public final Handler handler; - private volatile boolean isRunning = false; - private Thread thread; + private static final ExecutorService exec = Executors.newCachedThreadPool(); public Server(int port,Handler handler) { this.port = port; @@ -25,32 +27,34 @@ } public synchronized void start() throws IOException { - isRunning = true; final ServerSocket ss = newServerSocket(); - thread = new Thread("luan.webserver") { - public void run() { - try { - while(isRunning) { - Socket socket = ss.accept(); - new Connection(Server.this,socket); - } - } catch(IOException e) { - logger.error("",e); + exec.execute(new Runnable(){public void run() { + try { + while(!exec.isShutdown()) { + final Socket socket = ss.accept(); + exec.execute(new Runnable(){public void run() { + Connection.handle(Server.this,socket); + }}); } + } catch(IOException e) { + logger.error("",e); } - }; - thread.start(); + }}); logger.info("started server on port "+port); } - public synchronized void stop() { - isRunning = false; + public synchronized boolean stop(long timeoutSeconds) { try { - thread.join(); + exec.shutdownNow(); + boolean stopped = exec.awaitTermination(timeoutSeconds,TimeUnit.SECONDS); + if(stopped) + logger.info("stopped server on port "+port); + else + logger.warn("couldn't stop server on port "+port); + return stopped; } catch(InterruptedException e) { throw new RuntimeException(e); } - logger.info("stopped server on port "+port); } }