我有一个Thread(假设是T1)从socket中读取数据:
public void run() {
while (running) {
try {
BufferedReader reader = new BufferedReader( new InputStreamReader(socket.getInputStream()) );
String input = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
另一个线程(比方说T2)尝试在其中一个方法中完成程序。因此T2执行以下操作:
T1.running = false;
socket.close();
以下是我无法找到解决方案的情况:
PS:“关于线程调试的另一个问题”
通常,当我逐步调试代码时,我在上下文切换上丢失了“活动运行线”。假设我在T1的第20行,发生上下文切换,让我们假设程序从T2的30.line继续,但是调试器不会显示/显示到T2的30.line,而是'active running line '消失了。所以我失去了对代码的控制权。我使用Eclipse for Java和Visual Studio for C#。那么在上下文切换时调试时跟踪代码的最佳方法是什么?
答案 0 :(得分:1)
假设您正在使用线程池,那么您应该创建一个ThreadFactory,在所有线程上安装Thread.UncaughtExceptionHandler,然后在ExecutorService上调用execute()而不是submit()。
对于调试问题,您应该阅读 http://msdn.microsoft.com/en-us/library/ms164746.aspx
答案 1 :(得分:1)
您的代码还有其他几个问题,所以我会同时解决所有这些问题。
BufferedReader
。否则,每次在循环中丢弃的缓冲区中都会丢失数据。readLine()
的结果测试为null。如果你得到它,你必须关闭BufferedReader
并退出循环。BufferedReader
并退出循环。我想要的是抓住这个SocketException。
所以抓住它。
我不能在T1.run()中放置try / catch(SocketException)。
你必须。没有选择。由于以上各项,你必须完全重写它。