Java Socket - 如何捕获 BufferedReader.readline() 的异常

标签 java multithreading sockets

我有一个线程(比方说 T1),它从套接字读取数据:

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();

这是我找不到解决方案的情况:

  • T1 处于 Activity 状态并等待读取某些输入,即阻塞。
  • 上下文切换
  • T2 处于 Activity 状态并将 running 设置为 false,关闭套接字
  • 上下文切换
  • 因为 T1 阻塞并且 T2 关闭了套接字,所以 T1 抛出异常。我想要的是捕获这个 SocketException。我无法在 T1.run() 中放置 try/catch(SocketException)。那么我怎样才能在T1的运行方法中捕获它呢?如果在T1运行时无法捕获它,那么我如何在其他地方捕获它?

PS:“另一个关于线程调试的问题”
通常,当我逐步调试代码时,我会在上下文切换上丢失“Activity 运行行”。假设我在 T1 的第 20 行,发生了上下文切换,假设程序从 T2 的 30.line 继续,但调试器不会转到/显示 T2 的 30.line,而是“Activity 运行行” ’消失了。所以我失去了对代码的控制。我使用 Eclipse for Java 和 Visual Studio for C#。那么在上下文切换调试时跟踪代码的最佳方法是什么?

最佳答案

对于假设您使用线程池的问题,也许您应该创建一个 ThreadFactory,在所有线程上安装 Thread.UncaughtExceptionHandler,然后使用 ExecutorService 上的execute()而不是submit()调用您的工作。

对于您的调试问题,也许您应该阅读 http://msdn.microsoft.com/en-us/library/ms164746.aspx

关于Java Socket - 如何捕获 BufferedReader.readline() 的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13598152/

相关文章:

java - 从数组列表填充表

java - 从数据存储中检索实体的时间

c - 当使用特定数量的线程时,Pthread 不起作用

c++ - 在 Vulkan 中为每个线程创建多个命令池

sockets - CFNetwork 在 iOS 和 MacOS 上优于 BSD 套接字和 GCD 的优势?

c - 拒绝绑定(bind)到套接字的用户模式权限

Java - 向下转型时出现 ClassCastException

java - 如何安装 Java Netbeans 插件测试我的代码

java - 线程问题,字段不更新

c - 这是在fork上关闭套接字描述符的正确方法吗?