DistributedBarrier 、DistributedDoubleBarrier 两个类,可以用来做分布式多个服务器准备做一件事情。这事一个分布式的操作。
DistributedBarrier
这个里面做的是,将准备的多个线程,加一个启动的项目,有一个人做启动的操作
package com.yellowcong.zookeeper.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.barriers.DistributedBarrier;
import org.apache.curator.framework.recipes.barriers.DistributedDoubleBarrier;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
* 创建日期:2017年10月14日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
public class CuratorDouble2 {
private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";
// Session 超时时间
private static final int SESSION_TIME_OUT = 60000;
// 连接超时
private static final int CONNECT_TIME_OUT = 5000;
private static DistributedBarrier barrier ;
public static void main(String[] args) throws Exception {
for(int i=0;i<5;i++){
new Thread(new Runnable() {
public void run() {
try {
// 1、设定重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(5000, 5);
// 2、获取工厂类
CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_PATH).retryPolicy(retryPolicy)
.sessionTimeoutMs(SESSION_TIME_OUT).connectionTimeoutMs(CONNECT_TIME_OUT).build();
// 3、启动连接
cf.start();
//获取DistributedBarrier
barrier = new DistributedBarrier(cf, "/distributeBarrirer");
System.out.println(Thread.currentThread().getName()+"\t同时等待");
barrier.setBarrier();
barrier.waitOnBarrier();
System.out.println(Thread.currentThread().getName()+"\t执行操作");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
Thread.sleep(10000);
//删除所有的拦截,这个相当于第6个对象,吹口哨的对象,让5个线程同时跑
if(barrier != null){
System.out.println("启动所有线程");
barrier.removeBarrier();
}
}
}
运行结果
都等待,等执行了removeBarrier,才会都启动
DistributedDoubleBarrier
这个分布式是,类始于CyclicBarrier 对象,等多个线程准备就绪了,就可以同时执行和同时退出了
package com.yellowcong.zookeeper.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.barriers.DistributedDoubleBarrier;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
* 创建日期:2017年10月14日 <br/>
* 创建用户:yellowcong <br/>
* 功能描述:
*/
public class CuratorDouble {
private static final String CONNECT_PATH = "192.168.66.110:2181,192.168.66.110:2182,192.168.66.110:2183";
// Session 超时时间
private static final int SESSION_TIME_OUT = 60000;
// 连接超时
private static final int CONNECT_TIME_OUT = 5000;
public static void main(String[] args) {
for(int i=0;i<5;i++){
new Thread(new Runnable() {
public void run() {
try {
// 1、设定重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(5000, 5);
// 2、获取工厂类
CuratorFramework cf = CuratorFrameworkFactory.builder().connectString(CONNECT_PATH).retryPolicy(retryPolicy)
.sessionTimeoutMs(SESSION_TIME_OUT).connectionTimeoutMs(CONNECT_TIME_OUT).build();
// 3、启动连接
cf.start();
//设置Barrier 5个同时准备的情况,这个是放在Thread 里面,就相当于每个线程都获取DistributedDoubleBarrier,然后更新操作里面的值
DistributedDoubleBarrier barrier = new DistributedDoubleBarrier(cf, "/dobuleBarrirer", 5);
System.out.println(Thread.currentThread().getName()+"\t同时等待");
barrier.enter();
System.out.println(Thread.currentThread().getName()+"\t同时执行任务");
barrier.leave();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
}
}
结果
这个没有吹哨的操作,直接线程数够了,就会启动