Java套接字消耗100%的CPU
我有一个插座,它消耗了计算机100%的CPU。 每30秒有150个客户端不同步地向服务器发送消息。 有人知道如何解决这个问题吗? 下面是我的ServerSocket类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);
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使用率,因此从这个意义上说,这可能是一个正确的答案。