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

1.1.12 多进路-多处理-多出路实验

本实现的目标是允许多个线程同时处理任务,更具体来讲,也就是每个线程都在处理自己的任务。

创建实验用的项目Semaphore_MoreToOne_1,类Service.java代码如下:


        package service;
        import java.util.concurrent.Semaphore;
        public class Service {
            private Semaphore semaphore = new Semaphore(3);
            void sayHello() {
                try {
                    semaphore.acquire();
                    System.out.println("ThreadName=" + Thread.currentThread().getName()
                              + "准备");
                    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());
                    semaphore.release();
                    System.out.println("ThreadName=" + Thread.currentThread().getName()
                              + "结束");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

线程类MyThread.java代码如下:


        package extthread;
        import service.Service;
        public class MyThread extends Thread {
            private Service service;
            public MyThread(Service service) {
                super();
                this.service = service;
            }
            @Override
            public void run() {
                service.sayHello();
              }
          }

运行类Run.java代码如下:


          package test.run;
          import service.Service;
          import extthread.MyThread;
          Public class Run {
              public static void main(String[] args) {
                  Service service = new Service();
                  MyThread[] threadArray = new MyThread[12];
                  for (int i = 0; i < threadArray.length; i++) {
                      threadArray[i] = new MyThread(service);
                      threadArray[i].start();
                  }
              }
          }

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

图1-24 打印循环中的内容为乱序

运行的效果是多个线程同时进入,而多个线程又几乎同时执行完毕。