一、多线程下Semphore相当一个信号灯的作用,CyclicBarrier是一个集合点的作用
二、Demo
package com.yezi.learn.semaphore;
import java.util.concurrent.*;
/**
* Created by yezi on 2014/5/12.
*/
public class TestSemaphoreAndCyclicBarrier {
public static void main(String []args){
testSemaphore();
testCyclic();
}
/***
* 同步工具,表示每次要弄满3个才能执行
*/
public static void testCyclic(){
final CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
ExecutorService service = Executors.newCachedThreadPool();
for(int i=0;i<3;i++){
service.execute(new Runnable() {
@Override
public void run() {
try {
Thread.sleep((long)(100*Math.random()));
System.out.println("wait1:"+(cyclicBarrier.getNumberWaiting()+1));
cyclicBarrier.await();
System.out.println("go");
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
});
}
}
/****
* 信号灯的意思,设置成3个表示,只有3个资源共享,当3个人进去了,另外的人
* 就只能抵挡在外面,当有一个人完成了就释放资源,其它的人就可以去争夺资源
*/
public static void testSemaphore(){
final Semaphore semaphore = new Semaphore(3);
ExecutorService service = Executors.newCachedThreadPool();
for(int i=0;i<10;i++){
service.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire(); //取得资源,获取信号灯
Thread.sleep(2000);
System.out.println("enter:"+(3-semaphore.availablePermits()));
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semaphore.release(); //释放信号灯
}
}
});
}
}
}