突击并发编程JUC系列演示代码地址: https://github.com/mtcarpenter/JavaTutorial前端
前面两个章节学习了 CountDownLatch
和 CyclicBarrier
,他们都是递减同步器,今天学习递增同步器 Semaphore
。 Semaphore
(信号量)是用来控制同时访问特定资源的线程数量,它经过协调各个线程,以保证合理的使用公共资源。看到这个信号量个人脑海中就出现了红绿灯,为了保证学生的安全,学校的十字路口通常都设有红绿灯,车流量控制,每一次绿灯同时能通行 100 辆汽车,没有在绿灯通行的汽车都会被阻塞,直到下一次绿灯。java
新日学校植树节活动,植树节地点中途必须经过一个红绿灯的十字路口,红绿灯的十字路口每次时间有限,一次红绿灯的时间只能经过两个年级的同窗,示例以下:git
public class SemaphoreExample1 { private final static int gradeNum = 6; private static Semaphore semaphore = new Semaphore(2); public static void main(String[] args) throws Exception { ExecutorService exec = Executors.newScheduledThreadPool(gradeNum); System.out.println("校门口红绿灯等待中....."); for (int i = 0; i < gradeNum; i++) { int gradeName = i + 1; exec.submit(() -> { try { // 获取一个许可 semaphore.acquire(); wait(gradeName); // 释放一个许可 semaphore.release(); } catch (Exception e) { } }); } exec.shutdown(); } private static void wait(int gradeName) throws Exception { TimeUnit.SECONDS.sleep(1); System.out.println(gradeName + "年级经过红绿灯......"); } }
运行结果以下:github
校门口红绿灯等待中..... 1年级经过红绿灯...... 2年级经过红绿灯...... 4年级经过红绿灯...... 3年级经过红绿灯...... 5年级经过红绿灯...... 6年级经过红绿灯......
你们运行此段代码会发现控制台,两个子线程同时打印。编程
欢迎关注公众号 山间木匠 , 我是小春哥,从事 Java 后端开发,会一点前端、经过持续输出系列技术文章以文会友,若是本文能为您提供帮助,欢迎你们关注、点赞、分享支持,咱们下期再见!<br />后端