使用Semaphore实现同一时间最多n个线程访问某个方法。
场景如:10个同学进入食堂,但只有3个窗口工作;
package com.aoyang;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
public class Playground {
public static void main(String[] args) {
//假设只有三个窗口
Semaphore semaphore = new Semaphore(3);
//10位同学进入餐厅
for (int i = 0; i < 10; i++) {
new Thread(new Student(i + "", semaphore)).start();
}
}
static class Student implements Runnable {
private String name;
private Semaphore semaphore;
public Student(String name) {
this.name = name;
}
public Student(String name, Semaphore semaphore) {
this.name = name;
this.semaphore = semaphore;
}
@Override
public void run() {
try {
System.out.println("同学" + name + "进入餐厅大队列");
TimeUnit.SECONDS.sleep(1);
if (semaphore != null) {
semaphore.acquire();
}
System.out.println("同学" + name + "进入窗口");
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
System.out.println("同学"+ name + "离开窗口");
if (semaphore != null) {
semaphore.release();
}
}
}
}
}
本文通过一个具体场景演示了如何使用Semaphore来限制同一时间访问某资源的线程数量。假设在一个食堂中,虽然有10个学生需要就餐,但只有3个窗口可以同时提供服务,Semaphore确保了任何时候最多只有三个线程(学生)可以访问窗口。
2114

被折叠的 条评论
为什么被折叠?



