JDK 1.5新機能--java.util.concurrent CyclicBarrier(2)


実際のアプリケーションでは、同じことを完了するために複数のスレッドが同時に動作する必要がある場合があります.また、完了中に他のスレッドがあるフェーズを完了してから実行するのを待つことが多く、すべてのスレッドがあるフェーズに達してから統一的に実行します.
例えば、深セン、広州、韶関、長沙を経由して武漢に到着する旅行団がいくつかあります.旅行団の中にはドライブ旅行があり、徒歩があり、観光バスに乗る人がいます.これらのツアーは同時に出発し、目的地に着くたびに、他のツアーがここに到着してから同時に出発し、ターミナル武漢に到着するまで待たなければならない.
このときCyclicBarrierが役に立ちます.CyclicBarrierの最も重要な属性は参加者数であり,また最も重要な方法はawait()である.すべてのスレッドがawait()を呼び出すと、これらのスレッドは実行を続行できます.そうしないと待機します.package concurrent;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class TestCyclicBarrier {
  //  : Shenzhen, Guangzhou, Shaoguan, Changsha, Wuhan
  private static int[] timeWalk = 58151510 };
  // 
  private static int[] timeSelf = 1344};
  // 
  private static int[] timeBus = 2466};
  
  static String now() {
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    return sdf.format(new Date()) ": ";
  }

  static class Tour implements Runnable {
    private int[] times;
    private CyclicBarrier barrier;
    private String tourName;
    public Tour(CyclicBarrier barrier, String tourName, int[] times) {
      this.times = times;
      this.tourName = tourName;
      this.barrier = barrier;
    }
    public void run() {
      try {
        Thread.sleep(times[01000);
        System.out.println(now() + tourName + " Reached Shenzhen");
        barrier.await();
        Thread.sleep(times[11000);
        System.out.println(now() + tourName + " Reached Guangzhou");
        barrier.await();
        Thread.sleep(times[21000);
        System.out.println(now() + tourName + " Reached Shaoguan");
        barrier.await();
        Thread.sleep(times[31000);
        System.out.println(now() + tourName + " Reached Changsha");
        barrier.await();
        Thread.sleep(times[41000);
        System.out.println(now() + tourName + " Reached Wuhan");
        barrier.await();
      catch (InterruptedException e) {
      catch (BrokenBarrierException e) {
      }
    }
  }

  public static void main(String[] args) {
    // 
    CyclicBarrier barrier = new CyclicBarrier(3);
    ExecutorService exec = Executors.newFixedThreadPool(3);
    exec.submit(new Tour(barrier, "WalkTour", timeWalk));
    exec.submit(new Tour(barrier, "SelfTour", timeSelf));
    exec.submit(new Tour(barrier, "BusTour", timeBus));
    exec.shutdown();
  }
}

実行結果:00:02:25:SelfTour Reached Shenzhen 00:02:25:BusTour Reached Guangzhou 00:02:27:WalkTour Reached Shenzhen 00:02:30:SelfTour Reached Guangzhou 00:02:31:BusTour Reached Guangzhou 00:02:35:WalkTour Reached Guangzhou 00:02:39:SelfTour Reached Shaoguan 00:02:41:BusTour Reached Shaoguan