Java中的Socket服务器多线程资源问题

Java中的Socket服务器多线程资源问题,java,multithreading,serversocket,Java,Multithreading,Serversocket,我正在从事一个类似HQ trivia的项目,其中多个客户端连接到服务器并提交他们对一个问题的答案,为此我用java编写了代码,其中用户连接到一个ServerSocket,并为每个客户端创建了一个新线程。可能有成千上万的客户。虽然只测试100个客户端,但服务器的CPU使用率达到95%。我在下面提供了一些代码。如果有人能帮我找到一个有效的方法来处理这么多客户,我将不胜感激 主类的源 可运行的客户端工作类 服务器规格为HDD:451G CPU:24 RAM:16G 提前感谢您的帮助。您需要一个非阻塞实

我正在从事一个类似HQ trivia的项目,其中多个客户端连接到服务器并提交他们对一个问题的答案,为此我用java编写了代码,其中用户连接到一个ServerSocket,并为每个客户端创建了一个新线程。可能有成千上万的客户。虽然只测试100个客户端,但服务器的CPU使用率达到95%。我在下面提供了一些代码。如果有人能帮我找到一个有效的方法来处理这么多客户,我将不胜感激

主类的源

可运行的客户端工作类

服务器规格为HDD:451G CPU:24 RAM:16G


提前感谢您的帮助。

您需要一个非阻塞实现-使用
SocketChannel
()或一个预先存在的框架,如Netty。另请参阅。您需要一个非阻塞实现—使用
SocketChannel
()或一个预先存在的框架,如Netty。另请参阅。
public class Server {

            //static ServerSocket variable
            private static ServerSocket server;
            //socket server port on which it will listen
            private static int port = 9876;

   public static void main(String[] args) throws IOException, ClassNotFoundException {
        try {
        server = new ServerSocket(port);
        while(true){
            ClientWorker w;
            try{
                //server.accept returns a client connection
                System.out.println("Waiting for a connection to accept.");
                w = new ClientWorker(server.accept(), this);
                Thread t = new Thread(w);
                t.start();
                } catch (IOException e) {
                  System.out.println("Accept failed: 9876");
                  System.exit(-1);
                }
            }
        } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    }
}
class ClientWorker implements Runnable {
    Server server;
    private Socket client;
    private String clientName = "";
    private String id = "";

    PrintStream printStream;
    BufferedReader bufferedReader;

    //Constructor
    ClientWorker(Socket client, Server server) {
        this.client = client;
        this.server= server;
    }

    @Override
    public void run() {
    try {
            bufferedReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
            printStream = new PrintStream(client.getOutputStream());
            while(client.isConnected())
            {
                String message = bufferedReader.readLine();
                //Some logical operation on users message
                printStream.println("response");
            }
        }
    }
}