Semaphore
前两次写了并发包的CountDownLatch 和 CyclicBarrier 今天写一下Semaphore
Semaphore 的字面意思是信号量 可以控制线程数
package test;import java.util.concurrent.Semaphore;import java.util.concurrent.TimeUnit;public class TestTwo {public static void main(String[] args) { Semaphore sp = new Semaphore(3);for (int i = 0; i < 8; i++) {new MyThread(sp).start();}// 如果可用数是0 那么线程就需要等待 等待别的线程release//这里写没有任何意义 只是为了测试一下这个函数 System.out.println("sp的可用permit数:" + sp.availablePermits());}}// 自定义线程class MyThread extends Thread { Semaphore sp;public MyThread(Semaphore sp) {this.sp = sp;}public void run() {try {// 获取资格 System.out.println(getName() + "准备获取资格!!!"); sp.acquire(); System.out.println(getName() + "获取资格执行任务!!!"); TimeUnit.MILLISECONDS.sleep(5000);} catch (Exception e) { e.printStackTrace();} finally {// 释放资格 释放了 别的线程才能申请到资格 sp.release();}}}
上边例子可以看到 Semaphore sp 的初始值是3 也就是只能有三个线程同时工作
需要获取Semaphore 许可的其他线程 必须等待获取许可的这三个线程release 才能进行资格的获取 如果获取成功 就可以执行任务
在理解Semaphore 的时候我们可以类比(但是底层不是这样的 只是为了理解 来类比)Lock锁 Lock锁是针对一个对象 多个线程来抢占,只有一个可以成功 而Semaphore 是多个线程来抢占,但是有N个(例子中是3个)可以抢占成功