现在的位置: 首页 > 综合 > 正文

java线程系列—Semaphore信号灯

2018年04月12日 ⁄ 综合 ⁄ 共 822字 ⁄ 字号 评论关闭

例如:共有三张椅子,现在有十人人等着去坐,一张椅子只能坐一人,坐上椅子后离开给等待的人坐,例子如下:

public class SemaphoreTest {

public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
final  Semaphore sp = new Semaphore(3);
//共有十个线程,有三个信号许可,一次性可以进来三个线程
for(int i=0;i<10;i++){
Runnable runnable = new Runnable(){
public void run(){
try {
sp.acquire();//获取许可
} catch (InterruptedException e1) {
e1.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + 
"进入,当前已有" + (3-sp.availablePermits()) + "个并发");
try {
Thread.sleep((long)(Math.random()*10000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程" + Thread.currentThread().getName() + 
"即将离开");

sp.release();//释放许可
//下面代码有时候执行不准确,因为其没有和上面的代码合成原子单元
System.out.println("线程" + Thread.currentThread().getName() + 
"已离开,当前已有" + (3-sp.availablePermits()) + "个并发");
}
};
//service.execute(runnable);
}
}

}

抱歉!评论已关闭.