Semaphore 是信号量的意思,通过信号量可以对同一资源访问做数量的限制。
同一时刻最多有多少线程访问,超过的就要等待,当之前的线程让出去时,后面的线程才能继续访问。
Semaphore semaphore = new Semaphore(10);
Random random = new Random();
//开启100个线程
for (int i = 0; i < 100; i++) {
new Thread(() -> {
try {
//最多有10个线程申请许可成功,其他线程阻塞在这里!
semaphore.acquire();
System.out.println(Thread.currentThread().getName() + " 从信号量申请许可");
} catch (InterruptedException e) {
e.printStackTrace();
}
//使用随机数设置占用资源时间
try {
int time = random.nextInt(10) * 100;
Thread.sleep(time);
System.out.println(Thread.currentThread().getName() + " 占用资源" + time + "毫秒");
} catch (InterruptedException e) {
e.printStackTrace();
}
//释放许可给信号量
semaphore.release();
System.out.println(Thread.currentThread().getName() + " 释放许可,将其返回信号量");
}, "线程->" + i).start();
}
结果:
线程->0 从信号量申请许可
线程->1 从信号量申请许可
线程->2 从信号量申请许可
线程->3 从信号量申请许可
线程->4 从信号量申请许可
线程->5 从信号量申请许可
线程->6 从信号量申请许可
线程->7 从信号量申请许可
线程->8 从信号量申请许可
线程->9 从信号量申请许可
线程->8 占用资源0毫秒
线程->10 从信号量申请许可
线程->8 释放许可,将其返回信号量
线程->2 占用资源300毫秒
线程->7 占用资源300毫秒
线程->2 释放许可,将其返回信号量
线程->11 从信号量申请许可
线程->12 从信号量申请许可
线程->7 释放许可,将其返回信号量
线程->6 占用资源400毫秒
线程->6 释放许可,将其返回信号量
......
线程->93 释放许可,将其返回信号量
线程->92 占用资源400毫秒
线程->95 占用资源300毫秒
线程->92 释放许可,将其返回信号量
线程->95 释放许可,将其返回信号量
线程->97 占用资源300毫秒
线程->97 释放许可,将其返回信号量
线程->86 占用资源800毫秒
线程->86 释放许可,将其返回信号量
线程->84 占用资源900毫秒
线程->84 释放许可,将其返回信号量
线程->99 占用资源400毫秒
线程->99 释放许可,将其返回信号量
线程->88 占用资源900毫秒
线程->88 释放许可,将其返回信号量
线程->98 占用资源600毫秒
线程->98 释放许可,将其返回信号量
线程->90 占用资源900毫秒
线程->90 释放许可,将其返回信号量
线程->96 占用资源900毫秒
线程->96 释放许可,将其返回信号量
网友评论