我有一个客户端套接字列表,通常大小约为2000。这些客户端是动态的,会进出。
我有一个带有32个线程的固定线程池的ExecutorService处理这些线程。此执行器服务负责解码和发送要发送到这2000个客户端的消息。
我想防止执行器服务的两个或多个线程同时处理同一个客户端。
一种方法是引入另一个记账线程(因此最终拥有32 + 1个线程),该线程负责在上一个相应于同一客户端的消息完成时调用ExecutorService.submit(message) 。但我不确定这是否会引入瓶颈,这意味着这个新引入的记账线程可能无法跟上提交消息的速度。
理想情况下,我不想预先分配线程给一组客户端,因为消息负载在客户端之间不均匀分布。也事先不知道。
有哪些方法可以解决这个问题?它们由java.util.concurrent功能提供吗?
更新
如评论所指出的,这是一个快速的摘要:
我不想每个客户端都有一个单独的线程,因为这样会有2000个线程。
理想情况下,我不想预先分配线程给一组客户端,因为消息速率在所有客户端之间不均匀分布,并且事先不知道。
消息顺序必须得到保留。
我认为,如果线程A正在等待线程B,因为B已经向同一客户端发送消息,那么这样做是不好的。换句话说,在任何时候,仅有一个线程正在处理一个客户端。
我有一个带有32个线程的固定线程池的ExecutorService处理这些线程。此执行器服务负责解码和发送要发送到这2000个客户端的消息。
我想防止执行器服务的两个或多个线程同时处理同一个客户端。
一种方法是引入另一个记账线程(因此最终拥有32 + 1个线程),该线程负责在上一个相应于同一客户端的消息完成时调用ExecutorService.submit(message) 。但我不确定这是否会引入瓶颈,这意味着这个新引入的记账线程可能无法跟上提交消息的速度。
理想情况下,我不想预先分配线程给一组客户端,因为消息负载在客户端之间不均匀分布。也事先不知道。
有哪些方法可以解决这个问题?它们由java.util.concurrent功能提供吗?
更新
如评论所指出的,这是一个快速的摘要:
我不想每个客户端都有一个单独的线程,因为这样会有2000个线程。
理想情况下,我不想预先分配线程给一组客户端,因为消息速率在所有客户端之间不均匀分布,并且事先不知道。
消息顺序必须得到保留。
我认为,如果线程A正在等待线程B,因为B已经向同一客户端发送消息,那么这样做是不好的。换句话说,在任何时候,仅有一个线程正在处理一个客户端。
A
和B
都获取了消息1
和2
,但由于线程调度,消息2
将先被发送。 - Isaac Vero