我正在使用套接字创建一个简单的聊天程序,我有一个ArrayList来存储每个连接客户端的套接字和用户名的活动对象类,并在这些类中检查套接字是否仍处于打开状态,并调用如果不是,那么它的自我就会被加入。
服务器文件代码:
public synchronized void kick(ClientThread client){
try{
output.printLine("kicking " + client.getUsername());
clients.remove(client);
output.printLine("removed " + client.getUsername());
}catch(Exception e){
e.printStackTrace();
}
output.printLine("kicked ");
}
这是客户端对象在其套接字关闭时调用的内容。
客户端是存储客户端的ArrayList
客户端是我想要加入的类对象,客户端对象扩展了Thread
public void run(){
while(true){
try{
Thread.sleep(10);
if(isValid()){
/*bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
if(bufferedReader.ready()){
lastMsg = bufferedReader.readLine();
sendMessage("Hello");
bufferedReader.close();
}*/
}else{
output.printLine(this.getUsername() + " connection closed");
break;
}
}catch(Exception e){
e.printStackTrace();
}
}
server.kick(this);
try {
join();
} catch (InterruptedException e) {
e.printStackTrace();
}
output.printLine("joined " + getUsername());
}
这是来自客户端对象的run函数,底部是当套接字未连接时运行的代码,它从循环中断开并且应该加入其自身,但是它会挂起加入它自己。客户端正确地从ArrayList中删除,但无论我做什么,我都无法获得加入的线程。
答案 0 :(得分:1)
这不起作用。致join
一个线程意味着等到它死亡。如果你等待自己死,你会永远等待,因为只要你等待就不会死。
答案 1 :(得分:0)
如果套接字仍处于打开状态,并且如果不是,则调用其自身加入。
线程无法调用自身加入。如果线程想要退出,那么它只是从run()
方法返回。 等待该线程死亡的其他线程可以在其上调用thread.join()
。但正如@Vampire指出的那样,一个调用this.join()
的线程意味着它正在等待自己完成,但它永远不会,因为它正在等待自己完成。确实是充实的。
但无论我做什么,我都无法加入线程。
我认为这里的问题是你想要实现的目标。如果您希望线程完成,那么只需从run()
方法返回。如果您尝试通知其他线程您正在完成,那么他们应该执行join
- 。