类 Semaphore
一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire()
,然后再获取该许可。每个 release()
添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore
只对可用许可的号码进行计数,并采取相应的行动。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
使用场景:
可以控制访问特定资源的线程数量。
实现内容:
某个资源最多让2个线程同时访问该资源。
实现效果:
最多只能获取许可两个,只有释放了,才可以继续获取
实现代码:
测试类semaphoredemo
package semaphore.demo;
/**
* @program: Demo1
* @description: 测试类 semaphore
* @create: 2021-07-07 14:49
*/
public class semaphoredemo {
public static void main(String[] args) {
threadRunable threadRunable =new threadRunable();
for (int i = 0; i < 15; i++) {
// 初始化线程
Thread t1 = new Thread(threadRunable);
// 开启线程
t1.start();
}
}
}
类:threadRunable
package semaphore.demo;
import java.util.concurrent.Semaphore;
/**
* @program: Demo1
* @description: 线程
* @create: 2021-07-07 14:51
*/
public class threadRunable implements Runnable {
Semaphore semaphore = new Semaphore(2);
@Override
public void run() {
try {
semaphore.acquire();
System.out.println("获取许可acquire");
Thread.sleep(2000);
// 执行特定资源
// System.out.println("我就是执行的特定资源,也可以写入要执行的代码块");
semaphore.release();
System.out.println("释放许可release,释放后可添加许可");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}