package github.javaguide.transport.socket; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ThreadFactory; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; /** * @author shuang.kou * @createTime 2020年05月10日 08:01:00 */ public class SocketRpcServer { /** * 线程池参数 */ private static final int CORE_POOL_SIZE = 10; private static final int MAXIMUM_POOL_SIZE_SIZE = 100; private static final int KEEP_ALIVE_TIME = 1; private static final int BLOCKING_QUEUE_CAPACITY = 100; private ExecutorService threadPool; private static final Logger logger = LoggerFactory.getLogger(SocketRpcServer.class); public SocketRpcServer() { BlockingQueue workQueue = new ArrayBlockingQueue<>(BLOCKING_QUEUE_CAPACITY); ThreadFactory threadFactory = Executors.defaultThreadFactory(); this.threadPool = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES, workQueue, threadFactory); } public void start(int port) { try (ServerSocket server = new ServerSocket(port);) { logger.info("server starts..."); Socket socket; while ((socket = server.accept()) != null) { logger.info("client connected"); threadPool.execute(new SocketRpcRequestHandlerRunnable(socket)); } threadPool.shutdown(); } catch (IOException e) { logger.error("occur IOException:", e); } } }