我正在用Java编写UDP服务器来处理来自多个客户端的数据包。然后处理它。我所做的是服务器正在监听数据包&一旦收到数据包,它就会产生一个新线程来处理它 以下是示例代码: -
public void run() {
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正在处理数据库中的数据。
答案 0 :(得分:1)
它产生一个新线程来处理它。
真的很贵。这可能比不创建线程要慢。
另一种方法是使用线程池。
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
应implements Runnable
而不是extends Thread