您的位置:首页 > 编程语言 > Java开发

java并发包里的semaphore的用法

2014-06-12 00:00 447 查看
摘要: java.util.concurrent包里的semaphore,jdk里解释为计数信号量,这个听起来有些晦涩,现在我们姑且把它理解为信号灯吧。
日常生活中,我们可能经常会做火车,当我们想上厕所的时候,我们通常会看一下车厢与车厢之间的门上有个信号灯,如果那个信号灯是红的,则厕所里有人;否则,厕所里没人。所以,现在我们就把这个semaphore理解为厕所上面那个信号灯吧。

当然,火车上厕所里只有一个坑,只允许一个人进去。然而在笔者的童年时代都是一厕多坑的。

那么我们现在想象一下,如果一个厕所有4个坑,但是现在10个人上厕所,笔者就想在厕所门口挂4个灯,每进去一个人都要取走一盏灯进去,出来的时候,再把灯重新挂在厕所门口。这样,世界瞬间变的美好了。

代码:

package com.core.semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {

//10上厕所的人
final ExecutorService execu = Executors.newFixedThreadPool(10);

//只有四个坑,我把厕所门口放4个信号灯
final Semaphore s = new Semaphore(4);

//模拟10个人上厕所,但是厕所里只有4个坑,只能容纳4个同时在里面
for(int i=0;i<10;i++){
final int NO=i+1;

Runnable run = new Runnable() {

@Override
public void run() {
try {

//拿到信号灯
s.acquire();

System.out.println("线程:"+NO+"来了。。。");
Thread.sleep((long) (Math.random()*10000));

//拉完了,把信号灯重新挂在厕所门口
System.out.println("线程:"+NO+"拉完了。。。");
s.release();

} catch (InterruptedException e) {
e.printStackTrace();
}
}
};

execu.execute(run);
}

execu.shutdown();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Java concurrent semaphore