先解释下信号量要解决什么问题,打个比方,一个任务,需要从网卡读取参数,而且同一个时间只允许最多2个线程读取一个网卡的参数,现在有4个线程需要读取这个参数,那么理想情况是所有时间都有且只有2个线程在同时读取参数,这个时候就是信号量Semaphore登场了。
public class CompletionServiceDemo {
static final Semaphore semp = new Semaphore(2);
static class Mission implements Runnable{
private String name;
public Mission(String name){
this.name = name;
}
@Override
public void run() {
try {
semp.acquire();
for(int i=0;i<5;i++){
System.out.println(name + " misssion1 running " + i);
}
semp.release();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
new Thread(new Mission("m1")).start();
new Thread(new Mission("m2")).start();
new Thread(new Mission("m3")).start();
new Thread(new Mission("m4")).start();
}
}
Semaphore很好理解,构造函数中指定信号量的最大容量,acquire方法获取一个信号量,release方法释放一个信号量,控制台输出如下:
m1 misssion1 running 0
m1 misssion1 running 1
m1 misssion1 running 2
m1 misssion1 running 3
m2 misssion1 running 0
m1 misssion1 running 4
m2 misssion1 running 1
m2 misssion1 running 2
m3 misssion1 running 0
m2 misssion1 running 3
m2 misssion1 running 4
m3 misssion1 running 1
m3 misssion1 running 2
m4 misssion1 running 0
m4 misssion1 running 1
m4 misssion1 running 2
m4 misssion1 running 3
m4 misssion1 running 4
m3 misssion1 running 3
m3 misssion1 running 4
可见,同一时间,最多只有2个任务在并行