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

1.1.13 多进路-单处理-多出路实验

本实现的目标是允许多个线程同时处理任务,但执行任务的顺序却是同步的,也就是阻塞的,所以也称单处理。

创建实验用的项目Semaphore_MoreToOne_2,将Semaphore_MoreToOne_1项目中的所有源代码复制到项目Semaphore_MoreToOne_2中,更改类Service.java代码如下:


        package service;
        import java.util.concurrent.Semaphore;
        import java.util.concurrent.locks.ReentrantLock;
        public class Service {
            private Semaphore semaphore = new Semaphore(3);
            private ReentrantLock lock = new ReentrantLock();
            public void sayHello() {
                try {
                    semaphore.acquire();
                    System.out.println("ThreadName=" + Thread.currentThread().getName()
                              + "准备");
                  lock.lock();
                  System.out.println("begin hello " + System.currentTimeMillis());
                  for (int i = 0; i < 5; i++) {
                      System.out.println(Thread.currentThread().getName() + "打印"
                              + (i + 1));
                  }
                  System.out.println("   end hello " + System.currentTimeMillis());
                  lock.unlock();
                  semaphore.release();
                  System.out.println("ThreadName=" + Thread.currentThread().getName()
                          + "结束");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }
          }
      }

在代码中加入了ReentrantLock对象,保证了同步性。

程序运行结果如图1-25所示。

图1-25 打印循环中的内容为有序

在单处理步骤中实现了同步,所以打印的效果呈1,2,3,4,5这样的顺序。