Zookeeper的Curator客户端异步创建节点,没有先后顺序吗?

weixin_38051062 2017-08-14 08:34:38
先上代码: package book.chapter05.$5_4_2; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.api.BackgroundCallback; import org.apache.curator.framework.api.CuratorEvent; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.zookeeper.CreateMode; //使用Curator的异步接口 public class Create_Node_Background_Sample { static String path = "/zk-book"; static CuratorFramework client = CuratorFrameworkFactory.builder() .connectString("domain1.book.zookeeper:2181") .sessionTimeoutMs(5000) .retryPolicy(new ExponentialBackoffRetry(1000, 3)) .build(); static CountDownLatch semaphore = new CountDownLatch(2); static ExecutorService tp = Executors.newFixedThreadPool(2); public static void main(String[] args) throws Exception { client.start(); System.out.println("Main thread: " + Thread.currentThread().getName()); // 此处传入了自定义的Executor client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).inBackground(new BackgroundCallback() { @Override public void processResult(CuratorFramework client, CuratorEvent event) throws Exception { System.out.println("One event[code: " + event.getResultCode() + ", type: " + event.getType() + "]"); System.out.println("One Thread of processResult: " + Thread.currentThread().getName()); semaphore.countDown(); } }, tp).forPath(path, "init".getBytes()); // 此处没有传入自定义的Executor client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).inBackground(new BackgroundCallback() { @Override public void processResult(CuratorFramework client, CuratorEvent event) throws Exception { System.out.println("Two event[code: " + event.getResultCode() + ", type: " + event.getType() + "]"); System.out.println("Two Thread of processResult: " + Thread.currentThread().getName()); semaphore.countDown(); } }).forPath(path, "init2".getBytes()); semaphore.await(); System.out.println("通过CountDownLatch主线程一直等待,直到计数减到0"); tp.shutdown(); } } 运行结果情况(1): Main thread: main Two event[code: 0, type: CREATE] Two Thread of processResult: main-EventThread One event[code: -110, type: CREATE] One Thread of processResult: pool-3-thread-1 通过CountDownLatch主线程一直等待,直到计数减到0 运行结果情况(2): Main thread: main Two event[code: -110, type: CREATE] Two Thread of processResult: main-EventThread One event[code: 0, type: CREATE] One Thread of processResult: pool-3-thread-1 通过CountDownLatch主线程一直等待,直到计数减到0 问题内容: 请问一下,主线程中是 One先创建的节点,然后才是Two创建的节点,zookeeper对于同一客户端的会话请求不是顺序执行的吗?为什么有时候是Two先创建的节点,有时候是One先创建成功节点呢?
...全文
63 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

435

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧