Semaphore
Semaphore(信号量)是用来控制同时访问特定资源的线程数量。
import java.util.concurrent.*; /** * Created by Administrator on 2017/5/22 0022. */ public class Test { private static final int THREAD_COUNT = 10;//并发为10 private static ExecutorService threadPool = Executors .newFixedThreadPool(THREAD_COUNT); private static Semaphore s = new Semaphore(3); //设置最大访问量为3个 public static void main(String[] args) { for (int i = 0; i < THREAD_COUNT; i++) { threadPool.execute(new Runnable() { @Override public void run() { try { s.acquire();
Thread.sleep(3000); System.out.println("save data"); s.release(); } catch (InterruptedException e) { } } }); } threadPool.shutdown(); } }
从上面代码看出来给它10个线程,但是每次只允许3个并发的执行。
通过上面例子,来分析一下源码
构造函数
Semaphore(int permits) 接受一个整型的数字,表示可用的许可证数量,也是默认的非公平性模式
Semaphore(int permits,boolean fair)创建公平性还是非公平性模式
acquire()
- acquire()从此信号量获取一个许可,在提供一个许可前一直将线程阻塞,否则线程被中断。获取一个许可(如果提供了一个)并立即返回,将可用的许可数减 1。
如果没有可用的许可,则在发生以下两种情况之一前,禁止将当前线程用于线程安排目的并使其处于休眠状态:
release()
- 方法,并且当前线程是下一个要被分配许可的线程;或者
- 其他某些线程中断当前线程。
- 被此方法将其已中断状态设置为 on ;或者
- 在等待许可时被
中断
。
InterruptedException
,并且清除当前线程的已中断状态。 - 抛出:
InterruptedException
- 如果当前线程被中断
Semaphore还提供一些其他方法:
- int availablePermits() :返回此信号量中当前可用的许可证数。
- int getQueueLength():返回正在等待获取许可证的线程数。
- boolean hasQueuedThreads() :是否有线程正在等待获取许可证。
- void reducePermits(int reduction) :减少reduction个许可证。是个protected方法。
- Collection getQueuedThreads() :返回所有等待获取许可证的线程集合。是个protected方法。