本部分介绍CyclicBarrier类,该类通ReentrantLock 跟Condition。Barrier 顾名思义,只有所有线程数达到规定的数量时,它才会被触发执行。
如下段代码 只有线程12都执行时,才会执行它定义的线程。
1 package net.vincent.study.other;
2
3 import java.util.concurrent.BrokenBarrierException;
4 import java.util.concurrent.CyclicBarrier;
5
6 public class part1 {
7
8 /**
9 * This static mehthod create CyclicBarrier, and this barrier will sleep 1000 if number of count arrive
10 * @param number of count
11 * @return a CyclicBarrier that will sleep if number of await thread invoke.
12 */
13
14 public static CyclicBarrier getCyclicBarrier(int count){
15 if(count <=0)return null;
16 final CyclicBarrier cyclicBarrier = new CyclicBarrier(count,new Runnable(){
17 public void run(){
18 try {
19 Thread.sleep(1000);
20 } catch (InterruptedException e) {
21 e.printStackTrace();
22 }
23 System.out.println("conditon is arrive and CycleBarrier is running");
24 }
25 });
26 return cyclicBarrier;
27 }
28 /**
29 * Create
30 * @param nameOfThread
31 * @param cyclicBarrier
32 * @return
33 */
34 public static Thread getThread(String nameOfThread ,final CyclicBarrier cyclicBarrier ){
35 Thread thread= new Thread(nameOfThread){
36 public void run(){
37 System.out.println(this.getName()+"is begin; and count is "+(++count));
38 try {
39 cyclicBarrier.await();
40 } catch (InterruptedException e) {
41 // TODO Auto-generated catch block
42 e.printStackTrace();
43 } catch (BrokenBarrierException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 System.out.println(this.getName()+"finished");
48 }
49 };
50 return thread;
51
52 }
53
54 static int count = 0;
55 public static void main(String[] args) {
56 /** define a cyclicBarrier and number of barrier is 2.*/
57 CyclicBarrier cyclicBarrier = getCyclicBarrier(2);
58 Thread threadOne = getThread("threadOne",cyclicBarrier);
59 threadOne.start();
60 Thread threadTwo = getThread("threadTwo",cyclicBarrier);
61 threadTwo.start();
62
63
64 }
65
66
67 }
68