-
信号量:
- 信号量一般都有以下几个变量:
- 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();
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)