Semaphore翻译成字面意思为 信号量,Semaphore可以控同时访问的线程个数,通过 acquire() 获取一个许可,如果没有就等待,而 release() 释放一个许可。
acquire()用来获取一个许可,若无许可能够获得,则会一直等待,直到获得许可。
release()用来释放许可。注意,在释放许可之前,必须先获获得许可。
下面通过一个例子来看一下Semaphore的具体使用:
假若一个工厂有5台机器,但是有8个工人,一台机器同时只能被一个工人使用,只有使用完了,其他工人才能继续使用。那么我们就可以通过Semaphore来实现:
import java.util.concurrent.Semaphore; public class Main { public static void main(String[] args) { Semaphore semaphore = new Semaphore(5);//5台机器 //8个工人工作 for(int i=0;i<8;i++){ new Thread(new Worker(semaphore)).start(); } } }
import java.util.Random; import java.util.concurrent.Semaphore; import java.util.concurrent.TimeUnit; /** * 工人 */ public class Worker implements Runnable{ private Semaphore semaphore; public Worker(Semaphore semaphore){ this.semaphore = semaphore; } @Override public void run() { try { semaphore.acquire(); System.out.println(Thread.currentThread().getName()+"占用一个机器生产。。。"); int random = new Random().nextInt(10); TimeUnit.SECONDS.sleep(random); System.out.println(Thread.currentThread().getName()+"释放出机器"); semaphore.release(); } catch (InterruptedException e) { e.printStackTrace(); } } }
适用场景:
Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。
源码地址:https://github.com/qjm201000/concurrent_semaphore.git
扫描二维码关注公众号,回复:
4580189 查看本文章