要处理的服务器" n"来自Java

时间:2016-02-13 18:03:50

标签: java multithreading server udp

我正在用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正在处理数据库中的数据。

1 个答案:

答案 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.
}

注意:您的ReqHandlerimplements Runnable而不是extends Thread