开发者社区 > 云原生 > 正文

开这个线程池的好处在于什么呢?

我想问一下 https://github.com/alibaba/Sentinel/blob/master/sentinel-transport/sentinel-transport-simple-http/src/main/java/com/alibaba/csp/sentinel/transport/command/SimpleHttpCommandCenter.java#L106

上面这个类中run方法行如下:

@Override public void run() { boolean success = false; ServerSocket serverSocket = getServerSocketFromBasePort(port);

            if (serverSocket != null) {
                CommandCenterLog.info("[CommandCenter] Begin listening at port " + serverSocket.getLocalPort());
                socketReference = serverSocket;
                executor.submit(new ServerThread(serverSocket));
                success = true;
                port = serverSocket.getLocalPort();
            } else {
                CommandCenterLog.info("[CommandCenter] chooses port fail, http command center will not work");
            }

            if (!success) {
                port = PORT_UNINITIALIZED;
            }

            TransportConfig.setRuntimePort(port);
            executor.shutdown();
        }

其中 executor.submit(new ServerThread(serverSocket)); 这段代码是不是用线程池和直接开一个线程一样呢?开线程池还需要其他的开销...

并且 ServerThread 中的代码如下:

    @Override
    public void run() {
        while (true) {	//	一直循环,	单线程不断接收数据
            Socket socket = null;
            try {
            	//	serverSocket阻塞
                socket = this.serverSocket.accept();
                //	设置超时时间
                setSocketSoTimeout(socket);	
                //	每次有新的socket套接字则包装成HttpEventTask, 然后进行业务多线程提交并发执行任务
                HttpEventTask eventTask = new HttpEventTask(socket);
                bizExecutor.submit(eventTask);	//	异步提交执行任务
            } catch (Exception e) {
                CommandCenterLog.info("Server error", e);
                if (socket != null) {
                    try {
                        socket.close();
                    } catch (Exception e1) {
                        CommandCenterLog.info("Error when closing an opened socket", e1);
                    }
                }
                try {
                    // In case of infinite log.
                    Thread.sleep(10);
                } catch (InterruptedException e1) {
                    // Indicates the task should stop.
                    break;
                }
            }
        }
    }

也是就是这个线程一直会阻塞... 所以,我想问的就是 开这个线程池的好处在于什么呢?

原提问者GitHub用户qiaolin-li

展开
收起
码字王 2023-05-19 18:41:47 87 0
1 条回答
写回答
取消 提交回答
  • 这里个人觉得并没有太多的考虑,只是用单线程线程池能提供一个shutdowNow的功能来不用在逻辑做特殊处理直接中止run方法的执行。

    例如初始化使用了一个new Thread().start()实现了异步,本来应该是Runnable的ServerThread定义为了Thread(实际因为提交给了线程池,Runnable就够了),等等,其实我认为当时写的时候并没有考虑如此多,只是一种写法。另外这个只提供了最基本的功能,实际工程中推荐使用netty-http

    原回答者GitHub用户jasonjoo2010

    2023-05-19 21:17:03
    赞同 展开评论 打赏
问答分类:
问答地址:

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载