Semaphore可以维护当前访问自身线程的个数,并提供了同步机制,使用Semaphore可以控制同时访问资源想线程个数。单个信号量的Semaphore对象可以实现互斥锁功能,并且可以是由一个线程获得了“锁”,在由另外一个线程释放了“锁”。
package Thread03;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest {
public static void main(String[] args) {
ExecutorService service=Executors.newCachedThreadPool();//创建一个动态的线程池
final Semaphore sp=new Semaphore(3);//创建具有3个许可的信号量
for(int i=0;i<10;i++){//开启10个线程
Runnable runnable=new Runnable() {
@Override
public void run() {
try {
sp.acquire();//获取信号量的一个许可
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"进入,当前已有"+(3-sp.availablePermits())+"个并发");
try {
Thread.sleep((long)(Math.random()*1000));
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("线程"+Thread.currentThread().getName()+"即将离开");
sp.release();//释放信号量的一个许可
System.out.println("线程"+Thread.currentThread().getName()+"已离开,当前已有"+(2-sp.availablePermits())+"个并发");
}
};
service.execute(runnable);
}
}
}