使用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();
}
}
}
}
}