Semaphore 在许可可用前会阻塞每一个
acquire()
,然后再获取该许可。每个
release()
添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,
Semaphore
只对可用许可的号码进行计数,并采取相应的行动。
Semaphore 通常用于限制可以访问某些资源(物理或逻辑的)的线程数目。
package com.skydream.thread.Semaphore;
import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Task {
private static final int MAX_THREAD_COUNT = 5;
private Semaphore objSempahore = new Semaphore(MAX_THREAD_COUNT);
Lock lock = new ReentrantLock();
public void task() {
//lock.lock();
try {
objSempahore.acquire();
System.out.println(MAX_THREAD_COUNT-objSempahore.availablePermits());
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
objSempahore.release();
//lock.unlock();
}
}
}
package com.skydream.thread.Semaphore;
public class SempahoreTest {
/**
* @param args
*/
public static void main(String[] args) {
final Task objTask = new Task();
for(int i=0;i<20;i++)
{
new Thread(){
public void run() {
objTask.task();
};
}.start();
}
}
}
最多只能有5个线程进入task方法。