信号量Semaphore
信号量为多线程协作提供了更为强大的控制方法。从广义上说,信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许一个线程访问一个资源,而信号量却可以指定多个线程,同时访问某一个资源。 主要的方法有
- public void acquire():获得一个准入的许可,若无法获得会等待,知道有线程释放一个许可或者当前线程被中断
- public void anquireUniterruptibly():与acquire方法相似,但是不响应中断
- public boolean tryAcquire():尝试获得一个许可,如果成功返回true,否则为false,不会进行等待,会立刻返回
- public boolean tryAcquire(long timeout,TimeUnit unit):可以添加参数,表示指定时间内
- public void release():在线程访问结束后释放一个许可,使得其他等待许可的线程可以进行资源访问
代码案例如下:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
public class SemaphoreTest implements Runnable{
//包含5个许可的信号量
final Semaphore semp=new Semaphore(5);
@Override
public void run() {
try {
semp.acquire();
Thread.sleep(2000);
System.out.println(Thread.currentThread().getId()+"运行");
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
semp.release();
}
}
public static void main(String[] args) {
ExecutorService exec= Executors.newFixedThreadPool(20);
final SemaphoreTest demo=new SemaphoreTest();
for (int i=0;i<20;i++){
exec.submit(demo);
}
}
}
运行结果一部分截屏: