【发布时间】:2021-10-18 02:48:23
【问题描述】:
我的目标是处理线程内的 WebSocket 连接。如果我使用in a new Thread,服务器可以处理的WebSocket连接数是未知的。如果我使用in a Thread pool,那么服务器可以处理的WebSocket连接数就是线程池大小。
我不确定可用处理器和线程之间的相关性。 1 个处理器一次执行 1 个线程吗?
我的预期结果:创建比可用处理器更多的线程是不可取的,您应该重新设计处理 WebSocket 连接的方式。
在一个新的线程中
final Socket socket = serverSocket.accept();
new Thread(new WebSocket(socket, listener)).start();
在线程池中
final ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
final Socket socket = serverSocket.accept();
es.execute(new WebSocket(socket, listener));
为避免混淆,WebSocket 类是实现Runnable 的自定义类。据我所知,Java SE 没有 WebSocket 服务器,只有 WebSocket 客户端。
【问题讨论】:
-
stackoverflow.com/a/34689857/2478398 给出这个答案和它下面的答案。但实际上“这取决于”,并且取决于很多事情,例如您为每个线程分配的任务的 CPU 密集程度。
-
你所说的“句柄”到底是什么意思,你在什么环境中运行你的套接字?您没有使用现有平台(例如 Spring)自动为您处理这些问题是否有特定原因?
-
@BeUndead 假设并发概念和巧妙的硬件设计,
Executors.newFixedThreadPool(2000);不会造成问题,因为 1. 操作系统将一次委托每个线程Thread A - > Thread B - > Thread A和 2. CPU 现在能够执行 2同时线程,假设我有 4 个内核,最好的线程池大小是 8 个线程,我只需要重新设计如何在 8 个线程中处理 WebSocket 连接e.g. 2000 keep alive connections。我说的对吗? -
理想情况下,创建一个线程池(无论您的常规流量大小如何)并允许它增长(最好缩小)以处理峰值,让 java+OS 担心其余的......但即使更理想的是,不要自己这样做,使用上面推荐的 @chrylis 之类的库。这些都是非常复杂的话题,人们需要数年时间才能弄清楚(我当然没有),甚至需要更多年才能很好地实施。
-
@chrylis-cautiouslyoptimistic- "handle" 在这种情况下,服务器如何接收传入的数据包数据和发送数据包数据,目前我将每个 WebSocket 连接放在 1 个唯一的线程中,但这意味着我必须与 HTTP 请求/响应不同,创建 100 个线程的线程池来处理 100 个活动连接。环境?我还是在我的笔记本本地使用它,我没有推送它,可能使用的是graalvm。我还没有完成 thr SSL 上下文。
标签: java multithreading sockets websocket