1+ package com .brianway .learning .java .multithread .lock .example10 ;
2+
3+ /**
4+ * Created by Brian on 2016/4/15.
5+ */
6+
7+ import java .util .concurrent .locks .Condition ;
8+ import java .util .concurrent .locks .ReentrantLock ;
9+
10+ /**
11+ * P234
12+ * Condition实现顺序打印
13+ * 这里nextPrintWho的volatile关键词去掉也没什么影响
14+ */
15+ public class Run10_condition {
16+ volatile private static int nextPrintWho =1 ;
17+ private static ReentrantLock lock = new ReentrantLock ();
18+ final private static Condition conditionA = lock .newCondition ();
19+ final private static Condition conditionB = lock .newCondition ();
20+ final private static Condition conditionC = lock .newCondition ();
21+ public static void main (String [] args ) {
22+ Thread a = new Thread (){
23+ @ Override
24+ public void run () {
25+ try {
26+ lock .lock ();
27+ while (nextPrintWho != 1 ){
28+ conditionA .await ();
29+ }
30+
31+ for (int i =0 ;i <3 ;i ++){
32+ System .out .println ("ThreadA " +(i +1 ));
33+ }
34+ nextPrintWho =2 ;
35+ conditionB .signalAll ();
36+ } catch (InterruptedException e ) {
37+ e .printStackTrace ();
38+ } finally {
39+ lock .unlock ();
40+ }
41+ }
42+ };
43+
44+ Thread b = new Thread (){
45+ @ Override
46+ public void run () {
47+ try {
48+ lock .lock ();
49+ while (nextPrintWho != 2 ){
50+ conditionB .await ();
51+ }
52+ for (int i =0 ;i <3 ;i ++){
53+ System .out .println ("ThreadB " +(i +1 ));
54+ }
55+ nextPrintWho =3 ;
56+ conditionC .signalAll ();
57+ } catch (InterruptedException e ) {
58+ e .printStackTrace ();
59+ } finally {
60+ lock .unlock ();
61+ }
62+ }
63+ };
64+
65+ Thread c = new Thread (){
66+ @ Override
67+ public void run () {
68+ try {
69+ lock .lock ();
70+ while (nextPrintWho != 3 ){
71+ conditionC .await ();
72+ }
73+ for (int i =0 ;i <3 ;i ++){
74+ System .out .println ("ThreadC " +(i +1 ));
75+ }
76+ nextPrintWho = 1 ;
77+ conditionA .signalAll ();
78+ } catch (InterruptedException e ) {
79+ e .printStackTrace ();
80+ } finally {
81+ lock .unlock ();
82+ }
83+ }
84+ };
85+
86+ Thread [] aArray = new Thread [5 ];
87+ Thread [] bArray = new Thread [5 ];
88+ Thread [] cArray = new Thread [5 ];
89+
90+ for (int i = 0 ;i <5 ;i ++){
91+ aArray [i ] =new Thread (a );
92+ bArray [i ] =new Thread (b );
93+ cArray [i ] =new Thread (c );
94+
95+ aArray [i ].start ();
96+ bArray [i ].start ();
97+ cArray [i ].start ();
98+ }
99+
100+
101+ }
102+ }
103+
104+ /*
105+ 输出:
106+ ThreadA 1
107+ ThreadA 2
108+ ThreadA 3
109+ ThreadB 1
110+ ThreadB 2
111+ ThreadB 3
112+ ThreadC 1
113+ ThreadC 2
114+ ThreadC 3
115+ ThreadA 1
116+ ThreadA 2
117+ ThreadA 3
118+ ThreadB 1
119+ ThreadB 2
120+ ThreadB 3
121+ ThreadC 1
122+ ThreadC 2
123+ ThreadC 3
124+ ThreadA 1
125+ ThreadA 2
126+ ThreadA 3
127+ ThreadB 1
128+ ThreadB 2
129+ ThreadB 3
130+ ThreadC 1
131+ ThreadC 2
132+ ThreadC 3
133+ ThreadA 1
134+ ThreadA 2
135+ ThreadA 3
136+ ThreadB 1
137+ ThreadB 2
138+ ThreadB 3
139+ ThreadC 1
140+ ThreadC 2
141+ ThreadC 3
142+ ThreadA 1
143+ ThreadA 2
144+ ThreadA 3
145+ ThreadB 1
146+ ThreadB 2
147+ ThreadB 3
148+ ThreadC 1
149+ ThreadC 2
150+ ThreadC 3
151+
152+ */
0 commit comments