一个基本的解决方案是在线程上负责处理许多传入请求(具有您想要的限制),然后将它们交给其他工作程序/请求处理程序线程。这种基本结构与大多数服务器非常相似:主线程负责将请求传递给工作线程。当每个工作线程完成后,您可以更新共享/全局计数器,让主线程知道它可以建立新连接。这将需要同步,但它是一个简洁的抽象。
这是想法:
服务器线程:
// Receive Packet
while (true) {
serverLock.acquire();
try {
if (numberOfRequests < MAX_REQUESTS) {
packet = socket.receive();
numberOfRequests++;
requestThread(packet).run();
} else {
serverMonitor.wait(serverLock);
}
} finally {
serverLock.release();
}
}
请求线程:
// Handle Packet
serverLock.acquire();
try {
if (numberOfRequests == MAX_REQUESTS){
numberOfRequests--;
serverMonitor.pulse();
}
} finally {
serverLock.release();
}
这只是为了让您了解可以从什么开始。但是当您掌握了它的窍门后,您将能够进行优化和增强以确保同步完全正确。
一种特殊的增强,也适用于有限数量的请求,称为ThreadPool。