Java同時テーマ:CyclicBarrierは安全な門限システムを構築する。

4500 ワード

引き続き特集を発表します
今回はCyclicBarrierを紹介します。APIのコメントを見てください。
/**
 * A synchronization aid that allows a set of threads to all wait for
 * each other to reach a common barrier point.  CyclicBarriers are
 * useful in programs involving a fixed sized party of threads that
 * must occasionally wait for each other. The barrier is called
 * <em>cyclic</em> because it can be re-used after the waiting threads
 * are released.
一つはスレッドのセットを同時に一つの位置にブロックさせる同期補助類です。固定スレッドを含み、スレッド間が互いに待たなければならない場面では非常に有用である。cyclicとはCyclicBarrierが待っているスレッドが全部リリースされた後、繰り返し使用できるという意味です。英語のレベルはこのままです。。。)
CyclicBarrierはゲートと似ています。指定された数のスレッドはこのゲートに到達しなければいけません。ゲートは開きます。
以下はCyclicBarrierを使用して、門限システムをシミュレートする。
需要はこのようです。下校時間までは全部の学生はカードを使って、人数が揃って自動的にドアを開けて、家に帰ります。この需要は先ほどです。学校に子供を置き去りにする危険性を避けました。特に幼稚園や小学生など。
package com.zhy.concurrency.cyclic;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 *        
 * 
 * @author zhy
 * 
 */
public class CyclicBarrierTest
{

	/**
	 *     
	 */
	private final int STUDENT_COUNT = 10;

	/**
	 *     ,      
	 */
	final CyclicBarrier barrier = new CyclicBarrier(STUDENT_COUNT,
			new Runnable()
			{
				@Override
				public void run()
				{
					System.out.println("    ,  ....");
				}
			});

	public void goHome() throws InterruptedException, BrokenBarrierException
	{
		System.out.println(Thread.currentThread().getName() + "   ,      ~");
		barrier.await();
		System.out.println(Thread.currentThread().getName() + "    ~");
	}

	public static void main(String[] args) throws InterruptedException,
			BrokenBarrierException
	{

		final CyclicBarrierTest instance = new CyclicBarrierTest();

		/**
		 *           
		 */
		for (int i = 0; i < instance.STUDENT_COUNT; i++)
		{
			new Thread("  " + i +"  " )
			{
				public void run()
				{

					try
					{
						instance.goHome();
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					} catch (BrokenBarrierException e)
					{
						e.printStackTrace();
					}

				};

			}.start();
		}

	}
}
出力結果:
  1     ,      ~
  3     ,      ~
  5     ,      ~
  9     ,      ~
  7     ,      ~
  0     ,      ~
  2     ,      ~
  6     ,      ~
  8     ,      ~
  4     ,      ~
    ,  ....
  4      ~
  1      ~
  3      ~
  5      ~
  9      ~
  2      ~
  6      ~
  0      ~
  7      ~
  8      ~
ははは、どの幼稚園がこのようなシステムを使ったら、子供は学校を失うことはないでしょう。
CyclicBarrierはすべてのスレッドをバルブの位置に閉塞させ、待ち時間のスレッド数が予定の値に達したら、このバルブを開けます。ブロックスレッドと覚えていますが、ブロック操作ではなく、同じスレッドでawaitを力いっぱい落とすのは効果がありません。
上記の例はCyclicBarrierの基本的な使い方を示していますが、cyclicの機能は表示されていません。注釈で説明したからには、私達は例を見てみます。
私達は私達の門限を改造して、結局カードを使うのは現実的ではありませんて、今必要なのはこのようなです。学生は一人で歩くのは危険です。今は門衛が学校の入り口で守っています。
package com.zhy.concurrency.cyclic;

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 *         
 * 
 * @author zhy
 * 
 */
public class CyclicBarrierTest2
{

	/**
	 *     
	 */
	private final int STUDENT_COUNT = 12;

	/**
	 *  3      
	 */
	final CyclicBarrier barrier = new CyclicBarrier(3,
			new Runnable()
			{
				@Override
				public void run()
				{
					System.out.println(" 3      ,  ....");
				}
			});

	public void goHome() throws InterruptedException, BrokenBarrierException
	{
		System.out.println(Thread.currentThread().getName() + "   ,      ~");
		barrier.await();
	}

	public static void main(String[] args) throws InterruptedException,
			BrokenBarrierException
	{

		final CyclicBarrierTest2 instance = new CyclicBarrierTest2();

		/**
		 *           
		 */
		for (int i = 0; i < instance.STUDENT_COUNT; i++)
		{
			new Thread("  " + i +"  " )
			{
				public void run()
				{

					try
					{
						instance.goHome();
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					} catch (BrokenBarrierException e)
					{
						e.printStackTrace();
					}

				};

			}.start();
		}

	}
}
出力結果:
  0     ,      ~
  1     ,      ~
  2     ,      ~
 3      ,  ....
  3     ,      ~
  5     ,      ~
  7     ,      ~
 3      ,  ....
  4     ,      ~
  9     ,      ~
  6     ,      ~
 3      ,  ....
  11     ,      ~
  10     ,      ~
  8     ,      ~
 3      ,  ....
この例はCyclicBarrierの多重性を十分に表しています。そうですね。このようなシステムはもっと真実かもしれません。0コスト~ははは。
はい、興味のある歓迎メッセージ、