24.Semaphore
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 。。。 。。。 。。。