<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

    Email:kissyan4916@163.com
    posts - 26, comments - 19, trackbacks - 0, articles - 220

    線程--Semaphore

    Posted on 2009-12-23 23:14 啥都寫點 閱讀(449) 評論(0)  編輯  收藏 所屬分類: J2SE

       本例介紹第一個同步裝置:Semaphore,它是一個用來管理資源池的工具,可以看成是個通行證,線程想要從資源池拿到資源必須先拿到通行證,如果線程暫時拿不到通行證,線程就會被阻斷,進入等待狀態。

         在構造Semaphore對象時,必須提供通行證的數目,如"new Semaphore(3)"將創建一個具有3個通行證的Semaphore對象,一旦該對象被創建,其通行證數量是不能改變的。
         Semaphore的acquire方法取得一個通行證,如果通行證已經發完了,當前線程將進入等待狀態,直到有其他線程釋放了通行證。
         Semaphore的release方法釋放資源池。


    import java.util.ArrayList;
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    import java.util.concurrent.Semaphore;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;

    /**
     * Java 5.0里新加了4個協調線程間進程的同步裝置,它們分別是:
     * Semaphore, CountDownLatch, CyclicBarrier和Exchanger.
     * 本例主要介紹Semaphore。
     * Semaphore是用來管理一個資源池的工具,可以看成是個通行證,
     * 線程要想從資源池拿到資源必須先拿到通行證,
     * 如果線程暫時拿不到通行證,線程就會被阻斷進入等待狀態。
     
    */

    public class SemaphoreTest {
        
    /**
         * 模擬資源池的類
         * 只為池發放2個通行證,即同時只允許2個線程獲得池中的資源。
         
    */

        
    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);
                }

                
    // 發放2個通行證
                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() {
            
    // 準備10個資源的資源池
            final Pool aPool = new Pool(10);
            Runnable worker 
    = new Runnable() {
                
    public void run() {
                    String resource 
    = null;
                    
    try {
                        
    //取得resource
                        resource = aPool.get();
                        
    //用resource做工作
                        System.out.println("I am working on " + resource);
                        Thread.sleep(
    500);
                        System.out.println(
    "I finished on " + resource);
                    }
     catch (InterruptedException ex) {
                    }

                    
    //歸還resource
                    aPool.put(resource);
                }

            }
    ;
            
    // 啟動5個任務
            ExecutorService service = Executors.newCachedThreadPool();
            
    for (int i = 0; i < 5; i++{
                service.submit(worker);
            }

            service.shutdown();
        }
     
        
        
    public static void main(String[] args) {
            SemaphoreTest.testPool();
        }

    }


                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲成在人线电影天堂色| 亚洲妇熟XXXX妇色黄| 亚洲无砖砖区免费| 免费无码一区二区三区| 国产亚洲一区二区三区在线观看| 精品人妻系列无码人妻免费视频 | 亚洲宅男天堂a在线| 亚洲精品国产免费| 亚洲一区在线观看视频| 在线观看免费人成视频色9| 亚洲成a人片在线观看精品| 拍拍拍又黄又爽无挡视频免费| 四虎亚洲精品高清在线观看| 国产成人aaa在线视频免费观看 | 99热在线日韩精品免费| 亚洲VA中文字幕无码一二三区| 无码AV片在线观看免费| 33333在线亚洲| 国产在线不卡免费播放| 国产免费AV片在线观看播放| 亚洲AV无码久久精品蜜桃| 国产成人午夜精品免费视频| 亚洲精品动漫免费二区| 免费乱码中文字幕网站| 国内精品免费视频精选在线观看 | 亚洲高清国产AV拍精品青青草原 | 99久久免费看国产精品| 亚洲日本在线电影| 亚洲性久久久影院| 免费无码成人AV在线播放不卡 | 亚洲av无码专区在线电影天堂| 俄罗斯极品美女毛片免费播放| 中文字幕在线免费看线人| 亚洲人成网站日本片| 日韩精品成人亚洲专区| 91香蕉在线观看免费高清| 日韩国产精品亚洲а∨天堂免| 国产精品亚洲片在线| 全免费A级毛片免费看网站| 国产成人免费AV在线播放 | 亚洲精品中文字幕无乱码|