gpt4 book ai didi

java - 服务器在Java中同时处理来自多个客户端的 "n"请求

转载 作者:行者123 更新时间:2023-12-01 10:25:17 24 4
gpt4 key购买 nike

我正在用 Java 编写一个 UDP 服务器,它处理来自多个客户端的数据包,然后对其进行处理。我所做的是服务器正在监听数据包,一旦收到数据包,它就会生成一个新线程来处理它。
以下是示例代码:-

公共(public)无效运行() {

   try
{
serverSocket = new DatagramSocket(5676);
while(true)
{
byte[] receiveDataBuf = new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(receiveDataBuf,receiveDataBuf.length);
serverSocket.receive(receivePacket);
String sentence = new String(receiveDataBuf,0,receivePacket.getLength());
ReqHandler rh= new ReqHandler (sentence);
rh.start();
}
}
catch(Exception e)
{
}
}

由于非常频繁地收到客户端请求。问题是当我检查 CPU 百分比时,它占用了 20-30% {有时超过 30%}。我认为这可能是因为 ReqHandler 类处理充当 while(true) 的数据。我该如何处理这个问题?或者是否有任何其他方法来实现可以同时处理“n”个请求的服务器{同时在数据库中}。

注意:- ReqHandler 正在处理数据库中的数据。

最佳答案

it spawn a new thread to process it.

这确实很贵。这可能比不创建线程慢。

另一种方法是使用线程池。

try {
ExecutorService es = Executors.newCachedThreadPool();
serverSocket = new DatagramSocket(5676);
byte[] buf= new byte[1024];
DatagramPacket receivePacket = new DatagramPacket(buf, buf.length);

while(serverSocket.isOpen()) {
serverSocket.receive(receivePacket);
String sentence = new String(buf, 0, buf.getLength(), StandardCharsets.UTF_8);
es.submit(() -> {
try {
new ReqHandler (sentence).run();
} catch (Throwable t) {
LOG.error("Unable to process " + sentence, t);
}
});
}
} catch(Exception e) {
LOG.error(e); // don't ignore errors unless you know you can.
}

注意:您的ReqHandler应该实现Runnable而不是扩展Thread

关于java - 服务器在Java中同时处理来自多个客户端的 "n"请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35383391/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com