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(); } } }
标签:java,Thread,简单,使用,semaphore,Semaphore,public,资源 From: https://www.cnblogs.com/q202105271618/p/16997927.html