Semaphore的意思是信号量, 多线程中使用此类控制并发量, 常用的方法有acquire() 和 release()
Semaphore没有空参构造, 创建对象时必须传入一个permits 值, 代表最大并发数; 当permits = 1 时 ,代表单线程
下面看一个例子
package _Semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(1);
for (int i = 0; i < 5; i++) {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire();
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName()+" 执行");
semaphore.release();
}
});
}
}
}
运行的结果是
pool-1-thread-1 执行
pool-3-thread-1 执行
pool-2-thread-1 执行
pool-4-thread-1 执行
pool-5-thread-1 执行
注意打印每一行都有一秒的间隔 ,
多线程应用中 , 只要增加permits 值即可;
需要注意的是acquire() 和 release() 方法中 都可以传入 permits 值, 表示请求和释放信号量的值, 一般情况下, 请求和释放的值是匹配的(相等)
下面例子中, semaphore 对象中 的permits 值是10 , 线程中每个请求都占用4 个permits , 所以并发量是 10/4 = 2;
package _Semaphore;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreDemo {
public static void main(String[] args) {
Semaphore semaphore = new Semaphore(10);
for (int i = 0; i < 5; i++) {
ExecutorService newCachedThreadPool = Executors.newCachedThreadPool();
newCachedThreadPool.execute(new Runnable() {
@Override
public void run() {
try {
semaphore.acquire(4);
Thread.sleep(1000);
} catch (InterruptedException e) {
}
System.out.println(Thread.currentThread().getName()+" 执行");
semaphore.release(4);
}
});
}
}
}