Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java套接字消耗100%的CPU_Java_Sockets - Fatal编程技术网

Java套接字消耗100%的CPU

Java套接字消耗100%的CPU,java,sockets,Java,Sockets,我有一个插座,它消耗了计算机100%的CPU。 每30秒有150个客户端不同步地向服务器发送消息。 有人知道如何解决这个问题吗? 下面是我的ServerSocket类 public class Servidor { static ExecutorService es; public static void main(String[] args) throws Exception { es = Executors.newFixedThreadPool(150);

我有一个插座,它消耗了计算机100%的CPU。 每30秒有150个客户端不同步地向服务器发送消息。 有人知道如何解决这个问题吗? 下面是我的ServerSocket类

public class Servidor { 

  static ExecutorService es;    

  public static void main(String[] args) throws Exception {

    es = Executors.newFixedThreadPool(150);
    ServerSocket servidor = new ServerSocket(2010);

    while (true) {
      Socket soquete = null;

      try {
        System.out.println("Aguardando cliente: ");
        soquete = servidor.accept();
        System.out.println("Cliente Conectado: ");
        es.execute(new Conexao(soquete));

      } catch (Exception e) {
        e.printStackTrace();
      } 

    }

  }

}
Conexao类(实用程序类)接收客户端发送的字符串并将其保存在数据库中。 在我的Conexao课程之下

public class Conexao implements Runnable{

    Socket soquete;
    int contador = 0;

    public Conexao(Socket soquete) {
        super();
        this.soquete = soquete;
    }

    @Override
    public void run(){

        BufferedReader in = null;

        try{            
            in = new BufferedReader(new InputStreamReader(soquete.getInputStream()));                   

            while (!in.ready()) {/*System.out.println("!in.ready()");*/}

            String str =in.readLine();

            System.out.println("Rodando Thread"+Thread.currentThread().getName() + " : texto: " + str);                     

        }finally{               
            ...

            if(soquete != null){
                try {
                    soquete.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                }
            }           
        }       
}


} 

我通过删除部分“while(!in.ready()){/System.out.println(“!in.ready()”;/})”并在try块的末尾创建一个“Thread.sleep”

无需在每次通过循环时声明
soquete
Conexao的源在哪里“一个消耗100%计算机CPU的插座”——你是如何得出这个结论的?另外,正如@BenjaminUrquhart所指出的,你应该将
socket soquete
移动到
while
循环之外。Conexao是一个获取客户信息的类“soquete.getInputStream()并将消息写入数据库。此代码示例中没有明显的内容。下一步我会看
Conexao
。如果您可以重新创建场景,请尝试连接以查看哪些线程处于活动状态、使用了多少内存、使用了哪些函数等。如果您设法解决了问题,请将其添加到您的答案中,不要更正问题本身。@mark Rotterveel您真的认为这是“正确的答案”吗关于这个问题?@Jonaswillms为什么你认为我认为这是正确的答案?我发布了我的评论,因为OP发布了这个答案,然后继续编辑他们问题中的代码和他们的修复(我回滚了)。这就是说,使用
而(!in.ready)
是一个热循环,在接收数据之前,它可能会导致100%的CPU使用率,因此从这个意义上说,这可能是一个正确的答案。