Semaphore可以维护当前访问自身的线程个数,并提供了同步机制,使用Semaphore可以控制同时访问资源的个数。举一个通俗的例子:厕所里有5个坑,加入有十个人要上厕所,那么同时只能有5个人能够占用,当这5个人中的任何一个人用完之后,等待的5个人中又有一个人可以占用。
方法:
acquire():霸占一个信号灯。
availablePermits():获取可以提供的信号灯。
release():释放信号灯。
案例:
public class SemaphoreTest { public static void main(String[] args) { /*创建一个线程池*/ ExecutorService executorService = Executors.newCachedThreadPool(); /*创建一个信号灯对象【初始化3个灯】*/ final Semaphore semaphore = new Semaphore(3); for (int i=0; i<10;i++){ Runnable runnable = new Runnable() { @Override public void run() { /*************获取一个信号灯************/ try { semaphore.acquire(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() +", 进入,当前已有 " + (3 - semaphore.availablePermits()) +"并发"); /************休眠******************/ try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } /**************释放信号灯*************/ System.out.println(Thread.currentThread().getName() +"即将离开"); semaphore.release();//释放信号灯 System.out.println(Thread.currentThread().getName() +", 已离开,当前还有 " + (3 - semaphore.availablePermits()) +"并发"); } }; /*执行*/ executorService.execute(runnable); } } }