主线程:
 ...
 ...
 子线程()
其中子线程的结构
 run(){
  while(...){
    ..=serverSocket.accept();
  }
 }当在主线程执行System.exit(0)后,出现java.net.SocketException: socket closed异常。
问题应该出在..=serverSocket.accept()部分强行中断而导致该异常。
我想在执行System.exit(0)之前应该终止它的子线程。
其实直接关主线程也没什么关系,只是希望以柔和的方式结束程序,不能对哪怕小异常视之不理。

解决方案 »

  1.   

    没什么好办法,用 try-catch 好了。
      

  2.   

    请查看通道。可以设置你所要求的终止受阻塞的ServerSocket
      

  3.   

    在主类里面设置一个boolean型实例shutdown线程在执行的过程中查询主线程的shutdown是否设为true, 如果是则退出run()方法, 这样线程就自动结束了
      

  4.   

    1.子线程已经阻塞在accept()位置,它没有机会做其他事,怎么去查询标志?
    2.通道我不太明白,怎么设置,能不能说清楚点,给个简单例子?
    3.一楼说得比较实在,我如下加了个 try-catch ,问题解决
    当然仍期待更好的解决方法,明天来结贴。try {
          socket = serverSocket.accept();
    } catch (SocketException se) {}if(socket==null) break;
      

  5.   

    用 ServerSocket.accept() 的话,这种阻塞没有办法主动中断。如果使用 java.nio.channels.ServerSocketChannel 的话(就是所谓“通道”),就可以在另外一个线程中对本线程进行 interrupt() 来中断它。不过,即使这样,也需要在本线程中 try-catch,差不多。