有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java等待Zookeeper客户端线程停止

Zookeeper客户端启动时,它会创建两个线程:SendThreadEventThread

在应用程序关闭时,我希望工作线程等待Zookeeper线程完成,但在API中看不到任何合适的内容

然而,我只能调用ZooKeeper.close(),它将连接状态设置为CLOSED,并为EventThread排队“死亡事件”

来自ClientCnxn:

public void disconnect() {    
    this.sendThread.close();
    this.eventThread.queueEventOfDeath();
}
 

我错过什么了吗? 有没有一种方法可以在不修改ZK客户端代码的情况下连接Zookeeper线程


共 (1) 个答案

  1. # 1 楼答案

    没有合适的API,所以最后不得不使用反射:

            Field cnField = ZooKeeper.class.getDeclaredField("cnxn");
            cnField.setAccessible(true);
            ClientCnxn cnxn = (ClientCnxn) cnField.get(zoo);
            Field sendField = ClientCnxn.class.getDeclaredField("sendThread");
            sendField.setAccessible(true);
            Field eventField = ClientCnxn.class.getDeclaredField("eventThread");
            eventField.setAccessible(true);
            Thread sendThread = (Thread) sendField.get(cnxn);
            Thread eventThread = (Thread) eventField.get(cnxn);
            sendThread.join();
            eventThread.join();