Java程序挂起连接线程
我正在使用套接字制作一个简单的聊天程序,我有一个ArrayList来存储活动的对象类,每个连接的客户端都有套接字和用户名,在这些类中,它检查套接字是否仍然打开,如果没有打开,则调用其自身加入 服务器文件启动代码:Java程序挂起连接线程,java,multithreading,sockets,Java,Multithreading,Sockets,我正在使用套接字制作一个简单的聊天程序,我有一个ArrayList来存储活动的对象类,每个连接的客户端都有套接字和用户名,在这些类中,它检查套接字是否仍然打开,如果没有打开,则调用其自身加入 服务器文件启动代码: public synchronized void kick(ClientThread client){ try{ output.printLine("kicking " + client.getUsername()); clients.remov
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
客户机是我想要加入的类对象,客户机对象扩展了线程
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中删除,但无论我做什么,都无法使线程加入。这无法工作。加入一个线程意味着等待它死掉。如果你等待自己死去,你将永远等待,因为只要你等待,你就不会死 如果套接字仍然打开,则调用其自身连接(如果未连接) 线程不能要求自己被联接。如果一个线程想要退出,那么它只是从
run()
方法返回。等待该线程死亡的其他线程可以对其调用thread.join()
。但正如@Vampire所指出的,线程调用this.join()将意味着它在等待自己完成,但它永远不会,因为它在等待自己完成。的确如此
但无论我做什么,我都无法让线连接
我想这里的问题是你想要实现什么。如果希望线程完成,只需从
run()
方法返回即可。如果您试图通知其他线程您正在完成,那么他们应该执行join
-ing.应该加入自己的线程。您认为这意味着什么?我希望这样容易愚弄死亡:PI认为这是一种加入例外情况D:您知道我如何在不挂起的情况下加入此线程吗?取决于您如何定义join。正如我所说,你不能加入你自己,因为在这个上下文中加入意味着等待线程死亡,而当你等待的时候,你不能死亡。