Java程序挂起连接线程

Java程序挂起连接线程,java,multithreading,sockets,Java,Multithreading,Sockets,我正在使用套接字制作一个简单的聊天程序,我有一个ArrayList来存储活动的对象类,每个连接的客户端都有套接字和用户名,在这些类中,它检查套接字是否仍然打开,如果没有打开,则调用其自身加入 服务器文件启动代码: public synchronized void kick(ClientThread client){ try{ output.printLine("kicking " + client.getUsername()); clients.remov

我正在使用套接字制作一个简单的聊天程序,我有一个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

客户机是我想要加入的类对象,客户机对象扩展了线程

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。正如我所说,你不能加入你自己,因为在这个上下文中加入意味着等待线程死亡,而当你等待的时候,你不能死亡。