Java程序挂起加入一个线程

时间:2016-05-24 18:34:09

标签: java multithreading sockets

我正在使用套接字创建一个简单的聊天程序,我有一个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中删除,但无论我做什么,我都无法获得加入的线程。

2 个答案:

答案 0 :(得分:1)

这不起作用。致join一个线程意味着等到它死亡。如果你等待自己死,你会永远等待,因为只要你等待就不会死。

答案 1 :(得分:0)

  

如果套接字仍处于打开状态,并且如果不是,则调用其自身加入。

线程无法调用自身加入。如果线程想要退出,那么它只是从run()方法返回。 等待该线程死亡的其他线程可以在其上调用thread.join()。但正如@Vampire指出的那样,一个调用this.join()的线程意味着它正在等待自己完成,但它永远不会,因为它正在等待自己完成。确实是充实的。

  

但无论我做什么,我都无法加入线程。

我认为这里的问题是你想要实现的目标。如果您希望线程完成,那么只需从run()方法返回。如果您尝试通知其他线程您正在完成,那么他们应该执行join - 。