CyclicBarrier - jdk1.5併發包

什麼是CyclicBarrier

CyclicBarrier是JDK 5中java.util.Concurrent包中提出的同步類。CyclicBarrier可以用來等待子任務都完成後執行最後的任務。所有的線程等待其它線程到達Barrier。CyclicBarrier初始化時指定需要等待的線程數,通過調用CyclicBarrier.await()方法,所有線程阻塞等待直到都調用了await()方法。

Java中CyclicBarrier使用例子

import java.util.concurrent.CyclicBarrier;

public class CyclicBarrierTest{

	private static class Task implements Runnable{
		private CyclicBarrier barrier;

		public Task(CyclicBarrier barrier){
			this.barrier = barrier;
		}

		@Override
		public void run(){
			try {
                System.out.println(Thread.currentThread().getName() + " is waiting on barrier");
                barrier.await();
                System.out.println(Thread.currentThread().getName() + " has crossed the barrier");
            } catch (Exception ex){

            }
        }
	}

	public static void main(String[] args) {
		// creating CyclicBarrier with 3 parties i.e. 3 Threads needs to call await()
		final CyclicBarrier cb = new CyclicBarrier(3, new Runnable(){
			public void run(){
				// This task will be executed once all thread reaches barrier
				System.out.println("All parties are arrived at barrier, lets play");
			}
		});

		//starting each of thread
		Thread t1 = new Thread(new Task(cb), "Thread 1");
		Thread t2 = new Thread(new Task(cb), "Thread 2");
		Thread t3 = new Thread(new Task(cb), "Thread 3");

		t1.start();
		t2.start();
		t3.start();
	}
}

output:

Thread 1 is waiting on barrier
Thread 3 is waiting on barrier
Thread 2 is waiting on barrier
All parties are arrived at barrier, lets play
Thread 2 has crossed the barrier
Thread 3 has crossed the barrier
Thread 1 has crossed the barrier

什麼時候使用CyclicBarrier

考慮到CyclicBarrier的特性可以用來實現mapreduce任務,例如多玩家遊戲等待所有玩家都加入後纔開始遊戲。

CyclicBarrier重要知識點

1.CyclicBarrier可以用於所有線程到達barrier後執行任務

2.如果CyclicBarrier初始化了3個線程,這3個線程需要調用await()方法來消除barrier

3.線程將會阻塞在await()方法直到所有線程到達barrier

參考:

1.http://javarevisited.blogspot.hk/2012/07/cyclicbarrier-example-java-5-concurrency-tutorial.html

2.http://www.cnblogs.com/skywang12345/p/3533995.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章