-
信号量:
- 信号量一般都有以下几个变量:
- count:记录可以使用的资源数
- wait_list:等待信号量的队列
- 获取信号量需要判断count是否大于零,即
if( count > 0 )
- 若
count > 0 ,表示可以获取该信号量,意味着获取资源成功,无须睡眠进程 - 若
count == 0 ,表示不可以获取该信号量,需要进入等待队列中,此时等待队列长度为0,无进程等待 - 若
count < 0 ,表示不可以获取该信号量,且有Math.abs(count) 个进程在等待队列等待资源. - 注:不可以睡眠的进程无法获取信号量
Java - demo
import java.util.Arrays;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class Test {
public static void main(String [] args){
final Semaphore sem = new Semaphore(5);
ExecutorService exec = Executors.newCachedThreadPool();
for (int i = 0; i < 10; i++) {
int strI = i;
Runnable run = new Runnable() {
@Override
public void run(){
try {
sem.acquire();
System.out.println("Thread_" + strI);
Thread.sleep((long)Math.random()*1000);
sem.release();
System.out.println("-------------------" + sem.availablePermits());
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
exec.execute(run);
}
exec.shutdown();
}
}
|