复制代码代码如下 :
java.util.concurrent.countdownlatch import;
import java.util.concurrent.executorservice;
java.util.concurrent.executors import;
java.util.concurrent.timeUnit import;
com.netflix.curator.retrypolicy import;
com.netflix.curator.framework.curatorframework import;
com.netflix.curator.framework.curatorframeworkfactory import;
com.netflix.curator.framework.recipes.locks. interprocessmutex import;
com.netflix.curator.retry.exponentialbackoffretry import;
공개 수업 testcuratorlock {
/**
* @param args
* @Throws InterruptedException
*/
public static void main (string [] args)은 InterruptedException {
// TODO 자동 생성 메소드 스텁
CountdownLatch Latch = New CountdownLatch (5);
String Zookeeperconnectionstring = "LocalHost : 2181, LocalHost : 2182, LocalHost : 2183";
retrypolicy retrypolicy = New ExponentialBackoffRetry (1000, 3);
CuratorFramework 클라이언트 = CuratorFrameworkFactory.newclient (
Zookeeperconnectionstring, retrypolicy);
client.start ();
System.out.println ( "客户端启动。。。。");
executorService exec = executors.newCachedThreadPool ();
for (int i = 0; i <5; i ++) {
exec.Submit (New MyLock ( "Client" + I, Client, Latch));
}
exec.shutdown ();
latch.await ();
System.out.println ( "所有任务执行完毕");
client.close ();
System.out.println ( "客户端关闭。。。。");
}
정적 클래스 mylock은 런닝 가능한 {
개인 문자열 이름;
개인 큐레이터 프레임 워크 클라이언트;
개인 CountdownLatch Latch;
public mylock (문자열 이름, Curatorframework 클라이언트, CountdownLatch Latch) {
this.name = 이름;
this.client = 클라이언트;
this.latch = 래치;
}
공개 문자열 getName () {
반환 이름;
}
public void setName (문자열 이름) {
this.name = 이름;
}
@보수
public void run () {
// TODO 자동 생성 메소드 스텁
intervacessmutex lock = 새로운 IntersolocessMutex (클라이언트,
"/test_group");
노력하다 {
if (lock.acquire (120, timeUnit.seconds)) {
노력하다 {
// 여기에서 중요한 섹션 내부에서 작업을 수행하십시오.
System.out.println ( "----------" + this.name
+ "获得资源 ---------");
System.out.println ( "----------" + this.name
+ "正在处理资源 ---------");
Thread.sleep (10 * 1000);
System.out.println ( "----------" + this.name
+ "资源使用完毕 ---------");
latch.countdown ();
} 마지막으로 {
lock.release ();
System.out.println ( "----------" + this.name
+ "释放 ---------");
}
}
} catch (예외 e) {
// TODO 자동 생성 캐치 블록
e.printstacktrace ();
}
}
}
}