1前言
针对sychronized和ReentrantLock我们可以看见再同一时候就只能够有一个线程获得资源进行使用,那么如果我们想要在同一时刻有多个线程来使用资源,这个时候要怎么办呢?这就需要用到我们的信号量Semaphore。
2使用实例
下面展示具体的使用方法:package com.liutao.concurrent; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; /** * 演示信号量Semaphore的使用 */ public class SemaphoreDemo { static final Semaphore semp = new Semaphore(5); public static class SempDemo implements Runnable{ @Override public void run() { try { semp.acquire(); Thread.sleep(2000); System.out.println(Thread.currentThread().getId()+":done!"); semp.release(); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(20); final SempDemo sempDemo = new SempDemo(); for (int i = 0;i<20;i++){ executorService.submit(sempDemo); } } }
运行代码,我们可以看见执行结果是五个一组进行输出的。
12:done! 15:done! 14:done! 13:done! 11:done! 17:done! 16:done! 18:done! 20:done! 19:done! 22:done! 24:done! 23:done! 21:done! 25:done! 26:done! 28:done! 29:done! 27:done! 30:done!