官术网_书友最值得收藏!

1.1.1 類Semaphore的同步性

多線程中的同步概念其實就是排著隊去執行一個任務,執行任務是一個一個執行,并不能并行執行,這樣的優點是有助于程序邏輯的正確性,不會出現非線程安全問題,保證軟件系統功能上的運行穩定性。

那么本節就使用一個初步的案例來看看Semaphore類是如何實現限制線程并發數的。

創建實驗用的項目SemaphoreTest1,類Service.java代碼如下:


        package service;
        import java.util.concurrent.Semaphore;
        public class Service {
            private Semaphore semaphore = new Semaphore(1);
            public void testMethod() {
                try {
                    semaphore.acquire();
                    System.out.println(Thread.currentThread().getName()
                                  + " begin timer=" + System.currentTimeMillis());
                          Thread.sleep(5000);
                          System.out.println(Thread.currentThread().getName()
                                  + "    end timer=" + System.currentTimeMillis());
                          semaphore.release();
                      } catch (InterruptedException e) {
                          e.printStackTrace();
                      }
                  }
            }

類Semaphore的構造函數參數permits是許可的意思,代表同一時間內,最多允許多少個線程同時執行acquire()和release()之間的代碼。

無參方法acquire()的作用是使用1個許可,是減法操作。

創建3個線程類如圖1-3所示。

圖1-3 線程數量為3

運行類Run.java代碼如下:


        package test;
        import service.Service;
        import extthread.ThreadA;
        import extthread.ThreadB;
        import extthread.ThreadC;
        public class Run {
            public static void main(String[] args) {
                Service service = new Service();
                ThreadA a = new ThreadA(service);
                a.setName("A");
                ThreadB b = new ThreadB(service);
                b.setName("B");
                ThreadC c = new ThreadC(service);
                c.setName("C");
                a.start();
                b.start();
        c.start();
    }
}

程序運行后的效果如圖1-4所示。

圖1-4 同步運行了

說明使用代碼:


        private Semaphore semaphore = new Semaphore(1);

來定義最多允許1個線程執行acquire()和release()之間的代碼,所以打印的結果就是3個線程是同步的。

主站蜘蛛池模板: 济源市| 鹤峰县| 商都县| 临城县| 定兴县| 芜湖县| 娱乐| 东辽县| 闻喜县| 黎城县| 伊宁市| 社会| 昌图县| 于田县| 苍山县| 青海省| 丹凤县| 益阳市| 星子县| 泾川县| 民乐县| 黄冈市| 桦川县| 贡觉县| 陈巴尔虎旗| 东阿县| 宜都市| 伊宁县| 册亨县| 荔波县| 平遥县| 武清区| 灵璧县| 望城县| 安溪县| 南靖县| 昌宁县| 和静县| 昆明市| 金川县| 岚皋县|