Semaphore
在进程方面完成信号线的控制,可以控制某个资源下,可被同时访问的线程个数。对系统的访问量进行评估,信号量维护了一个许可集;在许可前会阻塞每一个 semaphore.acquire() ,然后再获取该许可,每一个release() 添加一个许可,从而
可能释放一个正在阻塞的获取者,但是,不使用实际的许可对象,Semaphore只对可用许可的号码进去计算,并采取行动,拿到信号量的线程则进入代码,否则就等待。
semaphore.acquire();//1.获取许可
semaphore.release();//3.访问完毕,释放
package demo1;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class DemoSemaphore {
public static void main(String[] args) {
ExecutorService executorService = Executors.newCachedThreadPool();
Semaphore semaphore = new Semaphore(3);
for (int i=0;i<=20;i++){
final int no =i;
Runnable runnable = new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();//1.获取许可
System.err.println("systme:"+no);
Thread.sleep((long) (Math.random()*1000));//2.模拟业务耗时
semaphore.release();//3.访问完毕,释放 ,如果屏蔽下面的语句,则在控制台只能打印5条记录,之后线程一直阻塞
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
System.err.println("。。。");
}
}
};
executorService.execute(runnable);
}
executorService.shutdown();
}
}
- 输出:
- systme:0
systme:1
systme:2
。。。
systme:3
。。。
systme:4
。。。
systme:5
。。。
systme:6
。。。
systme:7
。。。
systme:8
。。。
systme:9
。。。
systme:10
。。。
systme:11
。。。
systme:12
。。。
systme:13
。。。
systme:14
。。。
systme:15
。。。
systme:16
。。。
systme:17
。。。
systme:18
。。。
systme:19
。。。
systme:20
。。。
。。。
。。。