服务器应用程序在运行15分钟后耗尽CPU

时间:2016-07-13 22:21:43

标签: java multithreading networking cpu

我编写了一个服务器应用程序,它不断监听发送给它的数据。我顺便考虑了多线程。我有主线程,编写器线程和读者线程。当我启动程序时,一切都很完美。在大约15分钟的正常运行时间后,我的CPU使用量随机突然增加。我相信如果我没记错的话,它只能达到服务器应用程序的40%左右。我认为我在网络上做错了,因为这是我第一次使用套接字。

这是我用来读取数据的内容:

public void run(){
    Socket s = null;
    InputStream in = null;

    while (Main.running){
        try {
            s = network.getServerSocket().accept();
            in = s.getInputStream();
        } catch (IOException e){
            e.printStackTrace();
        }
        if (in != null){
            DataInputStream input = new DataInputStream(in);
            try {
                while (input.available() != -1) {
                    byte type = input.readByte();
                    PacketIn packet = Utils.getPacket(main, type);
                    packet.readData(input);
                    if (packet instanceof PacketInLogin) {
                        PacketInLogin login = (PacketInLogin) packet;
                        login.setSocket(s);
                        String server = login.getServer();
                        Socket socket = login.getSocket();
                        Main.log("Login request from server: '" + server + "'. Authenticating...");
                        boolean auth = login.authenticate();
                        Main.log("Authentication test for server: '" + server + "' = " + (auth ? "PASSED" : "FAILED"));
                        if (auth) {
                            main.getServers().put(server, new DataBridgeServer(main, server, socket));
                        }
                        main.getTransmitter().sendPacket(new PacketOutAuthResult(main, auth), socket);
                    } else if (packet instanceof PacketInDisconnect) {
                        PacketInDisconnect disconnect = (PacketInDisconnect) packet;
                        main.getServers().remove(disconnect.getServer().getName());
                        Main.log("'" + disconnect.getServer().getName() + "' has disconnected from network.");
                    }
                }
            } catch (IOException e){
                if (!(e instanceof EOFException)){
                    e.printStackTrace();
                }
            } finally {
                if (in != null){
                    try {
                        in.close();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
        }

    }
    try {
        if (s != null) s.close();
        if (in != null) in.close();
    } catch (IOException e){
        e.printStackTrace();
    }
}

这是我用来写数据(到客户端。这段代码仍然是服务器的一部分):

public void run(){
    while (Main.running){
        if (!QUEUED.isEmpty()){
            PacketOut packet = (PacketOut) QUEUED.keySet().toArray()[0];
            Socket server = QUEUED.get(packet);
            DataOutputStream out = null;
            try {
                out = new DataOutputStream(server.getOutputStream());
                packet.send(out);
            } catch (IOException e){
                e.printStackTrace();
            } finally {
                if (out != null){
                    try {
                        out.close();
                    } catch (IOException e){
                        e.printStackTrace();
                    }
                }
            }
            QUEUED.remove(packet);
        }
    }
}

0 个答案:

没有答案