1.Semaphore?
技术信号量用来控制能够同时访问某特定资源的活动的数量,或者同时执行某一给定操作的数据。计数信号量可以用来实现资源池或者给一个容器限定边界。
信号量维护了一个许可集,许可的初始量通过构造函数传递给Semaphore。活动能够获取许可,并在使用之后释放许可,如果没有可用的许可,acquire方法会被阻塞,直到有可用的为止。每个release方法添加一个许可,从而可能释放一个正在阻塞的获取者
2.使用方法
- Semaphore(int permits,boolean fair) 设置公平还是不公平的。
- Semaphore(int permits):创建具有给定许可数和非公平设置的Semaphore
- int availablePermits() :返回此信号量中当前可用的许可证数。
- int getQueueLength():返回正在等待获取许可证的线程数。
- boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
- void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
- Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。
3.SemaphoreDemo
- SemaphoreDemo
package com.mmall.concurrency.example.AQS.semaphore; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; public class SemaphoreDemo { public static void main(String[] args) { Semaphore semaphore=new Semaphore(3); Workers worker=new Workers("小黄",semaphore); Workers worker1=new Workers("小蓝",semaphore); Workers worker2=new Workers("小白",semaphore); Workers worker3=new Workers("小子",semaphore); Workers worker4=new Workers("小绿",semaphore); Workers worker5=new Workers("小黑",semaphore); Workers worker6=new Workers("小红",semaphore); ExecutorService executorService=Executors.newCachedThreadPool(); executorService.execute(worker); executorService.execute(worker1); executorService.execute(worker2); executorService.execute(worker3); executorService.execute(worker4); executorService.execute(worker5); executorService.execute(worker6); } }
- Workers
package com.mmall.concurrency.example.AQS.semaphore; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.Semaphore; @Slf4j public class Workers implements Runnable { private String name; private Semaphore semaphore; public Workers(String name, Semaphore semaphore) { this.name = name; this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); System.out.println(String.format("%s拿到了指令许可", name)); Thread.sleep(3000); System.out.println(String.format("%s工作结束,还剩%s没有拿到指令许可", name, semaphore.getQueueLength())); }catch (Exception e){ log.info("error{}",e); } semaphore.release(); } }
近期评论