diff src/luan/webserver/Server.java @ 1142:0f59eab45f3d

webserver - threading
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 30 Jan 2018 18:02:47 -0700
parents 4189027691b7
children d6d0bd05ad8c
line wrap: on
line diff
--- 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);
 	}
 
 }