我正在使用套接字在Java中编写客户端/服务器应用程序。在服务器中,我有一个接受客户端连接的线程,这个线程无限期地运行。在我的应用程序的某些时候,我想停止接受客户端连接,所以我想破坏该线程是唯一的方法。任何人都可以告诉我如何销毁线程吗?
这是我的代码:
class ClientConnectionThread implements Runnable {
@Override
public void run() {
try {
// Set up a server to listen at port 2901
server = new ServerSocket(2901);
// Keep on running and accept client connections
while(true) {
// Wait for a client to connect
Socket client = server.accept();
addClient(client.getInetAddress().getHostName(), client);
// Start a new client reader thread for that socket
new Thread(new ClientReaderThread(client)).start();
}
} catch (IOException e) {
showError("Could not set up server on port 2901. Application will terminate now.");
System.exit(0);
}
}
}
正如你所看到的那样,我有一个无限循环,而(true)在那里,所以这个线程永远不会停止,除非我以某种方式阻止它。
答案 0 :(得分:3)
执行此操作的正确方法是关闭服务器套接字。这将导致accept()
抛出您可以处理的IOException
并退出该线程。
我添加了一个public void stop()
方法,并将套接字作为该类中的一个字段。
private ServerSocket serverSocket;
public ClientConnectionThread() {
this.serverSocket = new ServerSocket(2901);
}
...
public void stop() {
serverSocket.close();
}
public void run() {
while(true) {
// this will throw when the socket is closed by the stop() method
Socket client = server.accept();
...
}
}
答案 1 :(得分:2)
一般情况下,你没有。你要求它使用Thread.interrupt()
打断它正在做的事情。
为什么在Javadoc中有一个很好的解释。
从链接:
停止的大部分用法应该由只修改一些的代码替换 变量,表示目标线程应该停止运行。该 目标线程应定期检查此变量,并从中返回 如果变量指示它,则以有序的方式运行它的方法 是停止运行。 (这是Java Tutorial的方法 始终建议。)确保及时沟通 stop-request,变量必须是volatile(或访问变量) 必须同步)。
应该注意的是,在等待线程没有响应Thread.interrupt
的所有情况下,它都不会响应Thread.stop
。
根据您的具体情况,您必须致电serverSocket.close
,因为它不会回复Thread.interrupt
。