协调线程间同步的类之四---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();
    }
}
相关文章
相关标签/搜索