協調線程間同步的類之四---Semaphore學習筆記

一。
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();
    }
}
相關文章
相關標籤/搜索