@RunWith(SpringRunner.class)
@SpringBootTest
public class TestApplicationTests {
private ZooKeeper zooKeeper;
@Test
public void contextLoads() {
try {
zooKeeper = new ZooKeeper("127.0.0.1:2181", 2000, watchedEvent -> System.out.println("已连接"));
String looks = "/locks";
Stat exists = zooKeeper.exists(looks, false);
if (exists == null) {
zooKeeper.create(looks, "locks".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
for (int i = 0; i < 20; i++) {
new Thread(() -> {
try {
String thisLock = zooKeeper.create(looks + "/lookName", "lock".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
String lockName = thisLock.substring(looks.length() + 1);
System.out.println(Thread.currentThread().getName() + "创建" + thisLock);
List<String> children = zooKeeper.getChildren(looks, false);
while (!getLock(children, looks, lockName)) {
CountDownLatch countDownLatch = new CountDownLatch(1);
for (int z = 1; z < children.size(); z++) {
if (children.get(z).equals(lockName)) {
System.out.println("正在等待:"+looks + "/"+children.get(z+1));
zooKeeper.exists(looks + "/" + children.get(z + 1), new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
countDownLatch.countDown();
}
});
}
}
countDownLatch.await();
children = zooKeeper.getChildren(looks, false);
}
//模拟处理工作
Thread.sleep(1000);
zooKeeper.delete(thisLock, -1);
System.out.println("释放锁! 线程名:" + Thread.currentThread().getName()+" "+thisLock);
} catch (Exception e) {
e.printStackTrace();
}
}, "线程" + i).start();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
}
}
private boolean getLock(List<String> children, String looks, String thisLock) throws KeeperException, InterruptedException {
if (children.get(children.size()-1).equals(thisLock)) {
System.out.println("获取到锁! 线程名:" + Thread.currentThread().getName());
return true;
} else {
System.out.println("未获取到获取到锁! 线程名:" + Thread.currentThread().getName());
}
return false;
}
}