技术问答-19

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个)可以抢占成功

上一篇:.net C#实现图像对比


下一篇:【Java并发编程实战】(十二):Semaphore——如何快速实现一个限流器