Java BufferedReader.readLine()正在创建线程()?
我正在尝试创建一个可以有多个用户的服务器,我只创建了两个线程,但是我的BufferedReader.readLine()似乎正在创建多个线程并导致OutOfMemory异常,我不明白为什么要这样做 导致异常的函数:Java BufferedReader.readLine()正在创建线程()?,java,multithreading,Java,Multithreading,我正在尝试创建一个可以有多个用户的服务器,我只创建了两个线程,但是我的BufferedReader.readLine()似乎正在创建多个线程并导致OutOfMemory异常,我不明白为什么要这样做 导致异常的函数: public void run() { try { Username = Input.readLine(); } catch (IOException e1) { disconnect(); } String lastI
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时,就没有更多的输入了。再也不会了。你可以尝试一下,而不是毫无意义的争论。如果你的代码是完美的,你就不必问这个问题了。