关闭由于serverSocket监听阻塞住的线程,对于未阻塞的线程简单的设置一个变量stop,每次轮询检测stop的值即可,但是这对于被阻塞的线程是行不通的。由于被阻塞住,根本无法检测stop变量的值。
方法
程序提供了closeClient()
方法,在这个方法中,首先设置stop变量为true,然后与本serverSocket建立链接,建立之后立即关闭。这样在run方法中的serverSocket由于接受了链接,便打破了阻塞的状态,打破阻塞后,立即检测stop变量,在检测完stop变量前不能使用socket。因为socket建立完立刻就被关闭了。如果检测到stop变量为true,那么关闭资源,跳出循环。如果stop变量为false,那么就做正常的处理。因此在构造方法中,需要将stop变量初始化为false。
下面是关键的代码段
public void run() {
while(true) {
if(stop) {
break;
}
try {
Socket socket = this.serverSocket.accept();
if(!stop) {
// do something.....
}else {
this.serverSocket.close();
System.out.println("server socket close");
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void closeClient(){
this.stop = true;
try {
new Socket(ip, port).close();
} catch (IOException e) {
e.printStackTrace();
}
}