Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit b0bc376

Browse files
committed
use ThreadPoolExecutor with dynamic number of threads
1 parent f76d6f1 commit b0bc376

1 file changed

Lines changed: 17 additions & 6 deletions

File tree

src/main/scala/server/Server.scala

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ package server
22

33
import java.io.FileNotFoundException
44
import java.net.{ServerSocket, Socket, SocketException, SocketTimeoutException}
5-
import java.util.concurrent.{Executors, ThreadFactory}
5+
import java.util.concurrent._
66

77
import com.typesafe.scalalogging.LazyLogging
88
import server.handler.Handler
@@ -14,7 +14,7 @@ import server.router.Router
1414

1515
object Server {
1616
def main (args: Array[String]) {
17-
val server = new Server(8080, 4)
17+
val server = new Server(8080, 10, 50)
1818

1919
server.getRouter.registerHandler(new Handler {
2020
override def handle(request: Request): Response = {
@@ -27,16 +27,25 @@ object Server {
2727
}
2828
}
2929

30-
class Server(val port: Int, val poolSize: Int) extends LazyLogging {
31-
private val threadPool = Executors.newFixedThreadPool(poolSize, new WorkerThreadFactory)
30+
class Server(val port: Int, val minThreads: Int, val maxThreads: Int) extends LazyLogging {
31+
private val executor = new ThreadPoolExecutor(
32+
minThreads,
33+
maxThreads,
34+
60,
35+
TimeUnit.SECONDS,
36+
new SynchronousQueue[Runnable](),
37+
new WorkerThreadFactory,
38+
new ThreadPoolExecutor.CallerRunsPolicy()
39+
)
40+
executor.allowCoreThreadTimeOut(true)
3241
private val router = new Router
3342

3443
def start(): Unit = {
3544
val serverSocket = new ServerSocket(port)
3645
while(true) {
3746
val socket = serverSocket.accept()
3847
logger.debug("Accepted new incoming connection")
39-
threadPool.execute(new Worker(socket, router))
48+
executor.execute(new Worker(socket, router))
4049
}
4150
}
4251

@@ -45,7 +54,9 @@ class Server(val port: Int, val poolSize: Int) extends LazyLogging {
4554

4655
class WorkerThreadFactory extends ThreadFactory {
4756
override def newThread(runnable: Runnable): Thread = {
48-
new WorkerThread(runnable, new RequestParser(new RequestLineParser, new HeaderParser))
57+
val t = new WorkerThread(runnable, new RequestParser(new RequestLineParser, new HeaderParser))
58+
t.setDaemon(true)
59+
t
4960
}
5061
}
5162

0 commit comments

Comments
 (0)