Java并发编程:核心方法与框架
上QQ阅读APP看书,第一时间看更新

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个线程是同步的。