在java中杀死线程
问题描述:
我创建一个服务器客户端程序,客户端根据服务器的响应向服务器发送特定信息。 对于不断从多个客户端侦听,我有一个线程在服务器上不断侦听客户端请求。无论何时收到请求,我启动另一个线程并发送该套接字运行并开始监听其他客户端的请求。在java中杀死线程
这里是代码连续听
while(true){
//serverListener is a ServerSocket object
clientSocket = serverListener.accept();//Waiting for any client request
//New thread started when request is received from any client
Thread thread =new Thread(new serverThread(clientSocket), "ClientThread");
thread.start();
}
现在我的问题是,如何才能停止服务器。我知道在while循环中使用boo lean变量,然后更改值的一种替代方法,但问题是当线程正在等待获取任何连接时,更改布尔变量的值也不会停止服务器。
有什么办法可以解决这个问题。
答
通常serverListener
(我认为其实是一个ServerSocket
什么的)被另一个线程关闭。这将在accept()
中生成java.net.SocketException
,这将终止循环和线程。
final ServerSocket serverSocket = new ServerSocket(8000);
new Thread(new Runnable() {
public void run() {
while (true) {
try {
serverSocket.accept();
} catch (IOException e) {
return;
}
}
}
}).start();
Thread.sleep(10000);
serverSocket.close();
答
volatile boolean finishFlag = false;
while(true){
clientSocket = serverListener.accept();//Waiting for any client request
if (finishFlag)
break;
//New thread started when request is received from any client
Thread thread =new Thread(new serverThread(clientSocket), "ClientThread");
thread.start();
}
编辑:
打断听众,你应该从外部阻止这个线程,然后接受()将抛出IOException异常
try {
while (true) {
Socket connection = server.accept();
try {
// any work here
connection.close();
}
catch (IOException ex) {
// maybe the client broke the connection early.
}
finally {
// Guarantee that sockets are closed when complete.
try {
if (connection != null) connection.close();
}
catch (IOException ex) {}
}
}
catch (IOException ex) {
System.err.println(ex);
}
+0
它继续等待accept(),直到接收到新客户端的客户端请求时才会进入下一行。我已经尝试过这种情况,并在问题中提到了这一点。 – Zlatan 2012-03-18 18:13:11
1级的解决方案,我发现是使用服务器套接字超时,然后使用布尔变量检查服务器是否停止。 – Zlatan 2012-03-18 18:32:48