Semaphore简单使用
Semaphore可以限制单个时间内允许活跃的线程数
//同一时间段允许3个线程活跃,非公平的模式 Semaphore semaphore = new Semaphore(3,false);
//这里表示拿到一份资源,剩下只有2份资源可用了 semaphore.acquire();
//这里表示释放一份资源,就又恢复成还有3份资源可用 semaphore.release();
效果图

图中显示同一个时间内只有三份资源可用
代码部分
package com.java.test.semaphores;
import lombok.extern.slf4j.Slf4j;
import java.util.Random;
import java.util.concurrent.Semaphore;
/**
* @Description:
* @Author: Yourheart
* @Create: 2022/12/22 10:13
*/
@Slf4j
public class SemaphoreThread extends Thread {
private final Semaphore semaphore;
private final Random random = new Random();
public SemaphoreThread(String name, Semaphore semaphore) {
super(name);
this.semaphore = semaphore;
}
@Override
public void run() {
try {
//这里表示拿到一份资源,剩下只有2份资源可用了
semaphore.acquire();
log.info(Thread.currentThread().getName() + " - 抢座成 功,开始写作业");
Thread.sleep(random.nextInt(1000));
log.info(Thread.currentThread().getName() + " - 作业完 成,腾出座位");
} catch (InterruptedException e) {
e.printStackTrace();
}
//这里表示释放一份资源,就又恢复成还有3份资源可用
semaphore.release();
}
}
package com.java.test.semaphores;
import java.util.concurrent.Semaphore;
/**
* @author yourheart
* @Description
* @create 2022-12-21 23:02
*/
public class SemaphoreDemo {
public static void main(String[] args) {
//同一时间段允许3个线程活跃,非公平的模式
Semaphore semaphore = new Semaphore(3,false);
for (int i = 0; i < 20; i++) {
new SemaphoreThread("学生-" + (i + 1), semaphore).start();
}
}
}
浙公网安备 33010602011771号