public class TestServer { public static void main(String[] args) { try { ServerSocket socket = new ServerSocket(11111); while (true) { //监听连接 Socket socket1 = socket.accept(); //新建一条线程去处理数据 new Thread(new TestServerHanlder(socket1)).start(); //使用线程池的方式去做处理 TestServerHandlerExcutePool pool = new TestServerHandlerExcutePool(100, 100); pool.execute(new TestServerHanlder(socket1)); } } catch (IOException e) { e.printStackTrace(); } } }
public class TestServerHanlder implements Runnable { private Socket socket; public TestServerHanlder(Socket socket) { this.socket = socket; } public void run() { BufferedReader in = null; PrintWriter out = null; try { in = new BufferedReader(new InputStreamReader(this.socket.getInputStream())); out = new PrintWriter(this.socket.getOutputStream(), true); String body = null; while (true) { body = in.readLine(); if (StringUtils.isBlank(body)) { break; } System.out.println("this is a test"); } } catch (Exception ex) { } } }
public class TestServerHandlerExcutePool { private ExecutorService service = null; public TestServerHandlerExcutePool(int maxPoolSize, int queueSize) { service = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), maxPoolSize, 120L, TimeUnit.SECONDS, new ArrayBlockingQueue<>(queueSize)); } public void execute(Runnable task) { service.execute(task); } }
传统的io流是阻塞式的,假如多条线程请求同一个数据,会导致阻塞,如下图api说明: