一。
java
1>Semaphore是用来管理一个资源池的工具,能够当作是个通行证,线程想要从资源池拿到资源必须先要拿到通行证,若是线程暂时拿不到通行证,线程就会被阻断进入阻断状态。安全
2>主要方法:semaphore.release();semaphore.acquire(),ide
3>下面代码是模拟资源池的类,职位池发放2个通行证,即同时只容许2个线程得到池中的资源。工具
public class SemaphoreTest { public static class Pool{ ArrayList<String> pool=null; Semaphore pass=null;// 通行证 Lock lock=new ReentrantLock(); public Pool(int size){ pool=new ArrayList<String>(); for(int i=0;i<size;i++){ pool.add("resource"+i); } pass=new Semaphore(2); } public String get() throws InterruptedException{ System.out.println("Try to get a pass"); pass.acquire(); System.out.println("Got a pass"); return getResource(); } public void put(String resource){ System.out.println("Released a pass"); pass.release(); releaseResource(resource); } private String getResource(){ lock.lock();//这里上锁是怕两个拿到通行证的线程出现线程安全问题 String result=pool.remove(0); System.out.println("资源"+result+"被取走了"); lock.unlock(); return result; } private void releaseResource(String resource){ lock.lock(); System.out.println("资源"+resource+"被归还"); pool.add(resource); lock.unlock(); } } public static void testPool(){ final Pool pool=new Pool(10); Runnable worker=new Runnable() { @Override public void run() { String resource=null; try { resource=pool.get(); System.out.println("i am working on "+resource); Thread.sleep(500); System.out.println("i finished on "+resource); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } pool.put(resource); } }; ExecutorService service=Executors.newCachedThreadPool(); for(int i=0;i<5;i++){ service.submit(worker); } service.shutdown(); } public static void main(String[] args) { testPool(); } }