一。
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(); } }