我想问一下 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
这里个人觉得并没有太多的考虑,只是用单线程线程池能提供一个shutdowNow的功能来不用在逻辑做特殊处理直接中止run方法的执行。
例如初始化使用了一个new Thread().start()实现了异步,本来应该是Runnable的ServerThread定义为了Thread(实际因为提交给了线程池,Runnable就够了),等等,其实我认为当时写的时候并没有考虑如此多,只是一种写法。另外这个只提供了最基本的功能,实际工程中推荐使用netty-http
原回答者GitHub用户jasonjoo2010
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。