我需要不断收听来自我的C#TCP服务器的消息,所以我在单独的线程中执行:
private void StartMessageReceivingLoop()
{
new Thread(){
public void run()
{
String msg = null;
try
{
msg = inputStream.readLine(); // inputStream is a BufferedReader instance.
}
catch (IOException e)
{
e.printStackTrace();
}
if (msg != null && msg != "")
NotifyAndForwardMessage(msg); // Notify listeners about the message.
run(); // Next iteration.
}
}.start();
}
我的方法有什么问题?为什么我得到StackOverflowError?我猜测run()
的调用速度非常快,因为BufferedReader.readLine()
是非阻塞的,但我该怎么办呢?
答案 0 :(得分:3)
请勿在{{1}}内致电run()
。这不是递归函数。如果你想在某种情况下继续阅读,请将其包裹在while循环中。通过在执行时调用正在执行的方法,您将创建另一个堆栈帧。你真正想要的只是循环。
run()
为了帮助说明,它有点像......
public void run() {
String msg = null;
while(true) { // Or whatever your exit condition is...
try {
msg = inputStream.readLine();
} catch(IOException e) {
// Handle properly.
}
if (msg != null && msg != "") {
NotifyAndForwardMessage(msg);
}
}
}