JDK5 Semaphore信号量

来源:互联网 发布:淘宝申请信用卡在哪里 编辑:程序博客网 时间:2024/06/06 04:33
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 blocke.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方法。