Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 BufferedReader.readLine()正在创建线程()?_Java_Multithreading - Fatal编程技术网

Java BufferedReader.readLine()正在创建线程()?

Java BufferedReader.readLine()正在创建线程()?,java,multithreading,Java,Multithreading,我正在尝试创建一个可以有多个用户的服务器,我只创建了两个线程,但是我的BufferedReader.readLine()似乎正在创建多个线程并导致OutOfMemory异常,我不明白为什么要这样做 导致异常的函数: public void run() { try { Username = Input.readLine(); } catch (IOException e1) { disconnect(); } String lastI

我正在尝试创建一个可以有多个用户的服务器,我只创建了两个线程,但是我的BufferedReader.readLine()似乎正在创建多个线程并导致OutOfMemory异常,我不明白为什么要这样做

导致异常的函数:

public void run() {
    try {
        Username = Input.readLine();
    } catch (IOException e1) {
        disconnect();
    }
    String lastInput = null;
    try {
        while ((lastInput = Input.readLine()) != null) {
            System.out.println(lastInput);
            if (lastInput.startsWith("Chat: ")) {
                sendToAllClients(lastInput.substring(7));
            }
        }
    } catch (IOException e) {
        disconnect();
    }
}
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Main.User.run(User.java:46)
at java.lang.Thread.run(Unknown Source)
例外情况:

public void run() {
    try {
        Username = Input.readLine();
    } catch (IOException e1) {
        disconnect();
    }
    String lastInput = null;
    try {
        while ((lastInput = Input.readLine()) != null) {
            System.out.println(lastInput);
            if (lastInput.startsWith("Chat: ")) {
                sendToAllClients(lastInput.substring(7));
            }
        }
    } catch (IOException e) {
        disconnect();
    }
}
Exception in thread "Thread-0" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(Unknown Source)
at java.lang.AbstractStringBuilder.append(Unknown Source)
at java.lang.StringBuffer.append(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at java.io.BufferedReader.readLine(Unknown Source)
at Main.User.run(User.java:46)
at java.lang.Thread.run(Unknown Source)

注意:Username=Input.readLine()正在生成异常,以避免无限循环,从而避免OOM异常:

try{
  while ((currentInput=Input.readLine()) != null) {
     if (currentInput.startsWith("Chat: "))
       sendToAllClients(currentInput.substring(7));
  }
catch (IOException e) { //bad to swallow exception:  let's the method throw it or make something with it here}

内存堆空间不足
图片显示程序正在无限循环中运行

您的代码:

 while (true) {
        try {
            lastInput = Input.readLine();
        } catch (IOException e) {}
        if (lastInput != null) {
            System.out.println(lastInput);
            if (lastInput.startsWith("Chat: ")) {
                sendToAllClients(lastInput.substring(7));
            }
        }
表示循环中的代码将无限次运行,而没有任何条件作为退出条件。即使出现问题:您正在捕获该异常,并且代码在循环中继续运行

这会导致
内存不足:堆空间。

建议的解决方案:

while (true) 
{
    try 
    {
        lastInput = Input.readLine();
    } 
    catch (IOException e) 
    {
     break;
    }
    if (lastInput != null) 
        {
           System.out.println(lastInput);
            if (lastInput.startsWith("Chat: ")) 
            {
            sendToAllClients(lastInput.substring(7));
            }
        }
}
一旦用户输入导致异常的任何名称(实际上作为while循环的退出条件),该循环就会中断

编辑

我认为可能是问题根源的一个领域是:

lastInput.substring(7)

如果
lastInput
字符串的大小很大,几乎可以填满系统上安装的JVM的
堆空间,那么从
第7个字符到最后一个字符调用
子字符串将在内部触发新
字符串的创建(因为字符串是不可变的),剩余堆空间不足时,
子字符串
执行会出现
OutOfMemory异常

首先:检查程序的while循环。 第二:设置参数set JAVA_OPTS=-Xms32m-Xmx512m。

readLine()不创建线程

如果“lastInput”为空,则应退出循环并关闭流


如果你得到一个异常,记录或打印它,关闭流,然后中断。

你不应该像那样吞咽异常…我不确定你为什么要在异常处理程序中处理
lastInput
…我不确定,但我认为无限循环试图让程序保持活动状态,使其像服务器一样运行。我更改了while循环,但用户名get是产生异常的行。如果循环if readLine()返回null,则此代码必须中断。否则就没用了-1我设置了Xms和Xmx,希望它已经修复了它。它的Username=Input.readLine()生成异常,该异常不在while循环中检查while循环如何执行?循环是在将其发送到服务器时从客户端获取所有输入。所以它只是把它打印出来。问题不在于循环,它的get Username=Input.readLine()当readLine()返回null时,就没有更多的输入了。再也不会了。你可以尝试一下,而不是毫无意义的争论。如果你的代码是完美的,你就不必问这个问题了。