• Java 传统的socket连接以及使用线程池连接


    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说明:

  • 相关阅读:
    MyBatis insert 返回主键的方法
    Linux实时网络监控工具:iftop
    深入理解Spring MVC 思想
    spring启动时加载字典表数据放入map
    mysql PROCEDURE ANALYSE() 用法
    http://www.cnblogs.com/shihaiming/
    maven 多模块项目
    分布式存储 CentOS6.5虚拟机环境搭建FastDFS-5.0.5集群(转载-2)
    Nginx1.8.0版本平滑升级新版本1.9.7
    Linux 添加Nginx 到 service 启动
  • 原文地址:https://www.cnblogs.com/wucaifang/p/Socket.html
Copyright © 2020-2023  润新知