Semaphore 信号量,控制并发的数量即 控制同时有几个线程同时执行 。
线程在执行前调用Semaphore 的acquire()方法获取线程执行权限,如果信号量里面有余的令牌,则当前线程可以执行,没有的话就等待
线程执行结束则调用release(),释放当前的令牌,其他线程就可以获取这个令牌,继续执行
获取可以的剩余信号令牌:availablePermits()
直接例子吧:
/** * 作用:Semaphore 信号量,控制并发的数量即 控制同时有几个线程同时执行 * 场景:前提:一个商店的工人倒班工作,按照工时给工资 * 商店同时需要5个人同时工作, 多余的其他工人等到这5个工人需要休息了,就顶上继续工作 */ public class SemaphoreTest { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5); ExecutorService executor = Executors.newFixedThreadPool(30) ; for(int i=0;i<10;i++ ){ executor.execute( new SlaveThread4(semaphore, i)); } executor.shutdown(); } } //工人类 class SlaveThread4 implements Runnable { //工人编号 private Integer number ; //线程开始标识 private Semaphore semaphore; public SlaveThread4(Semaphore semaphore , int number){ this.number = number ; this.semaphore = semaphore ; } @Override public void run() { try { semaphore.acquire(); System.out.println( "工人 "+number+" 开始工作"+new Date()); work() ; semaphore.release(); System.out.println( "工人 "+number+" 结束工作 , 剩余空缺人:"+semaphore.availablePermits()); } catch (InterruptedException e) { e.printStackTrace(); } } //抬起 public void work(){ try { //抬起箱子总共花费时间 3s Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }