一个计数信号量。在概念上,信号量维持一组许可证。如果有必要,每个acquire()都会阻塞,直到许可证可用,然后才能使用它。每个release()添加许可证,潜在地释放阻塞获取方。但是,没有使用实际的许可证对象; Semaphore只保留可用数量的计数,并相应地执行。信号量通常用于限制线程数,而不是访问某些(物理或逻辑)资源
我记得考科目一的时候有一个大教室,这个教室只能同时允许两百人考试,当有一个考完之后,下一个才能进去进行考试。门口会有安检人员进行安检,这个Semaphore就相当于这个安检员。
也可以理解为停车场,停车场内的停车位是固定的,只有当一辆或多辆车开走之后外面等待的车才能进去停车。
用法:
1、定义三个资格 Semaphore semaphore = new Semaphore(3); ThreadPoolExecutor poolExecutor = new ThreadPoolExecutor(10, 20, 5000, TimeUnit.MILLISECONDS, new LinkedBlockingDeque<>(100)); for (int i = 0; i < 10; i++) { int finalI = i; poolExecutor.execute(new Thread() { @Override public void run() { try { //获取执行资格 semaphore.acquire(1); System.out.println(finalI+"========="); //模拟每个线程运行的时间 Thread.sleep(1000); //释放执行资格 semaphore.release(1); } catch (InterruptedException e) { e.printStackTrace(); } } }); } poolExecutor.shutdown();