首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

java同步例子之信号量(Se地图hore)

2012-12-23 
java同步例子之信号量(Semaphore)信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),

java同步例子之信号量(Semaphore)
信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。

package concurrent;import java.util.Collections;import java.util.HashSet;import java.util.Set;import java.util.concurrent.Semaphore;/** * 通过以下两种方式获得许可 * acquire()  * tryAcquire() * @author user * */public class SemaphoreTest {private final Set<Integer> set;private final Semaphore sem;public SemaphoreTest(int bound){this.set = Collections.synchronizedSet(new HashSet<Integer>());sem = new Semaphore(bound);}public boolean add(Integer o) throws InterruptedException{sem.acquire(); //如果信号量已被用光阻塞boolean wasAdded = false;try{wasAdded = set.add(o);return wasAdded;} finally {if(!wasAdded){sem.release();}}}public boolean addNoAwait(Integer o) throws InterruptedException{boolean wasAdded = false;if(sem.tryAcquire()){try{wasAdded = set.add(o);} finally {if(!wasAdded){sem.release();}}}return wasAdded;}public boolean remove (Integer o){boolean wasRemoved = set.remove(o);if(wasRemoved){sem.release();}return wasRemoved;}/** * @param args * @throws InterruptedException  */public static void main(String[] args) throws InterruptedException {SemaphoreTest test = new SemaphoreTest(5);for(int i = 0; i < 10; i++){//System.err.println("add " + i + "=" +test.add(i));System.err.println("add " + i + "=" +test.addNoAwait(i));}}}

热点排行