【问题标题】:Java program hangs on joining a threadJava 程序在加入线程时挂起
【发布时间】:2016-05-24 18:34:09
【问题描述】:

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

这是客户端对象在其套接字关闭时调用的内容。

clients 是存储客户端的 ArrayList

client 是我要加入的类对象,client 对象扩展了 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());
}

这是来自客户端对象的运行函数,底部是在套接字未连接时运行的代码,它从循环中中断并应该加入它自己,但是它在加入它自己时挂起。客户端已从 ArrayList 中正确删除,但无论我做什么,我都无法让线程加入。

【问题讨论】:

  • 应该加入它自己你认为这意味着什么?

标签: java multithreading sockets


【解决方案1】:

这行不通。到join 一个线程意味着等到它死掉。如果你等待自己死去,你将永远等待,因为只要你等待,你就不会死。

【讨论】:

  • 我希望愚弄死亡这么容易:P
  • 我还以为是join ception D:你知道我怎样才能在不挂起的情况下加入这个线程吗?
  • 取决于您如何定义连接。正如我所说,你不能加入自己,因为在这种情况下加入意味着等待线程死亡,而在等待期间你不能死亡。
【解决方案2】:

如果套接字仍然打开,如果不是,则调用自身加入。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多