Java线程调用阻塞式函数时的优雅终止
如果在线程里面使用socket的阻塞式编程,则优雅关闭线程时需要注意:
tcpServerThread.isRun = false;
try{
if(tcpServerThread.socket != null)
tcpServerThread.socket.close();
if (tcpServerThread.serverSocket != null)
tcpServerThread.serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
退出时机:
1. 线程里面while循环使用isRun判断是否需要退出。
2. socket.close()之后,阻塞函数(accept、read)会导致SocketException异常,在线程里面捕获该异常,然后优雅退出。
public void run()
{
try{
serverSocket = new ServerSocket(port);
}catch (Exception e){
e.printStackTrace();
return;
}
while(isRun)
{
try{
// 等待客户端连接
socket = serverSocket.accept();
BufferedReader input = new BufferedReader(new InputStreamReader(socket.getInputStream()));
//注意第二个参数据为true将会自动flush,否则需要需要手动操作output.flush()
//PrintWriter output = new PrintWriter(socket.getOutputStream(), true);
char[] charArray = new char[8192];
while(isRun){
int rtnBytes = input.read(charArray);
}
socket.close();
}catch (SocketException e){
return;
}
catch (Exception e) {
e.printStackTrace();
}
}
try{
serverSocket.close();
}catch (Exception e){
e.printStackTrace();
}
}