日期:2014-05-20  浏览次数:20702 次

如何在主线程中柔和地结束子线程
主线程:
  ...
  ...
  子线程()


其中子线程的结构
  run(){
    while(...){
        ..=serverSocket.accept();
    }
  }

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

------解决方案--------------------
没什么好办法,用 try-catch 好了。
------解决方案--------------------
请查看通道。

可以设置你所要求的终止受阻塞的ServerSocket
------解决方案--------------------
用 ServerSocket.accept() 的话,这种阻塞没有办法主动中断。

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