学习java这么久,今天才接触到Semaphore(信号量)。惭愧啊,特此记录一下用法。
Semaphore的作用:
Semaphore是操作系统的信号量,用来控制同一时间访问的线程数,当超过可执行的线程数时,后面的线程将被挂起,直到正在执行的线程释放资源
Semaphore的用法:
Semaphore semaphore = new Semaphore(5);
构造函数中的参数表示同一时间可以执行的线程数,默认为1;
获取许可:
try {
//请求许可
semaphore.acquire();
} catch (Exception e) {
e.printStackTrace();
}
只有获取了许可之后,该线程才能够执行,否则将被挂起。
释放资源:
semaphore.release();
这里以一个车库的例子作为演示,一个车库只有5个车位,同时来了20辆车,进入5辆车之后,其余的车进行等待,如果有车离开了车库,后面等待的车子就可以进入,离开一辆,就多了一个空位,离开2辆就多了2个空位,这时候排队的2辆车就可以进入了
代码如下:
public class TestMain {
public static void main(String[] args) {
//最多有5个线程同时并发执行
Semaphore semaphore = new Semaphore(5);
for (int i = 0; i < 20; i++) {
new Thread("thread-->" + i) {
@Override
public void run() {
try {
//请求许可
semaphore.acquire();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":进入车库");
try {
Thread.sleep((long) Math.random() * 6000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":准备离开车库");
//访问完释放资源
semaphore.release();
//当前信号灯库里面有多少资源可以用
System.out.println(Thread.currentThread().getName() + ":已经离开车库,剩余车位:" + semaphore.availablePermits());
}
}.start();
}
}
}
执行的结果如下:
thread-->0:进入车库
thread-->3:进入车库
thread-->2:进入车库
thread-->1:进入车库
thread-->4:进入车库
thread-->0:准备离开车库
thread-->11:进入车库
thread-->0:已经离开车库,剩余车位:1
thread-->4:准备离开车库
thread-->4:已经离开车库,剩余车位:1
thread-->5:进入车库
thread-->1:准备离开车库
thread-->1:已经离开车库,剩余车位:1
thread-->6:进入车库
thread-->2:准备离开车库
thread-->2:已经离开车库,剩余车位:1
thread-->7:进入车库
thread-->3:准备离开车库
thread-->3:已经离开车库,剩余车位:1
thread-->8:进入车库
thread-->11:准备离开车库
thread-->11:已经离开车库,剩余车位:1
thread-->9:进入车库
thread-->5:准备离开车库
thread-->8:准备离开车库
thread-->8:已经离开车库,剩余车位:1
thread-->7:准备离开车库
thread-->6:准备离开车库
thread-->13:进入车库
thread-->7:已经离开车库,剩余车位:1
thread-->10:进入车库
thread-->12:进入车库
thread-->5:已经离开车库,剩余车位:1
thread-->9:准备离开车库
thread-->9:已经离开车库,剩余车位:1
thread-->15:进入车库
thread-->14:进入车库
thread-->6:已经离开车库,剩余车位:1
thread-->13:准备离开车库
thread-->13:已经离开车库,剩余车位:1
thread-->16:进入车库
thread-->10:准备离开车库
thread-->14:准备离开车库
thread-->17:进入车库
thread-->15:准备离开车库
thread-->12:准备离开车库
thread-->19:进入车库
thread-->15:已经离开车库,剩余车位:1
thread-->17:准备离开车库
thread-->16:准备离开车库
thread-->14:已经离开车库,剩余车位:0
thread-->18:进入车库
thread-->10:已经离开车库,剩余车位:1
thread-->16:已经离开车库,剩余车位:3
thread-->17:已经离开车库,剩余车位:2
thread-->19:准备离开车库
thread-->19:已经离开车库,剩余车位:4
thread-->12:已经离开车库,剩余车位:1
thread-->18:准备离开车库
thread-->18:已经离开车库,剩余车位:5
以上是Semaphore的简单使用方法!