通过名字就看出来了,是信号量。
信号量可以干什么呢?
信号量是根据一些阀值做访问控制。
我们这里模拟一个当多个线程并发一段代码的时候,如何控制其访问速度:
/**
* Created with IntelliJ IDEA.
* Description: Semaphor 信号量 根据一些阀值做访问控制。
* User: zhubo
* Date: 2018-03-22
* Time: 20:05
*/
public class SemaphoreExec {
private final static Semaphore MAX_SEMA_PHORE = new Semaphore(10);
/**
* 这里是简单模拟并发100个线程去访问一段程序,此时要控制最多同时运行的是10个,用到了这个信号量,
* 运行程序用了一个线程睡眠一个随机的时间来代替,你可以看到后面有线程说自己释放了,就有线程获得了,
* 没释放是获取不到的,内部实现方面,我们暂时不管,暂时知道这样用就OK。
* @param args
*/
public static void main(String[] args) {
for(int i = 0 ; i < 100 ; i ++){
final int num = i;
final Random random = new Random();
new Thread(){
@Override
public void run() {
boolean acquired = false;
try{
MAX_SEMA_PHORE.acquire();
acquired = true;
System.out.println("我是线程:" + num + " 我获得了使用权!" + DateTimeUtil.getDateTime());
long time = 1000 * Math.max(1, Math.abs(random.nextInt() % 10));
Thread.sleep(time);
System.out.println("我是线程:" + num + " 我执行完了!" + DateTimeUtil.getDateTime());
}catch (Exception e){
e.printStackTrace();
}finally {
if(acquired) {
MAX_SEMA_PHORE.release();
}
}
}
}.start();
}
}
private static final class DateTimeUtil{
public static String getDateTime(){
return new SimpleDateFormat("yyyy-MM-dd").format(new Date());
}
}
}
这里是简单模拟并发100个线程去访问一段程序,此时要控制最多同时运行的是10个,用到了这个信号量,运行程序用了一个线程睡眠一个随机的时间来代替,你可以看到后面有线程说自己释放了,就有线程获得了,没释放是获取不到的,内部实现方面,我们暂时不管,暂时知道这样用就OK。