1 /**
2 * 传统线程同步通信技术
3 *
4 * *******************************************
5 * 经验:
6 * 要用到共同数据(包括共同锁)或共同算法的若干个方法应该
7 * 归在用一个类身上,这种设计正好体现了高内聚和程序的健壮性。
8 *
9 * *******************************************
10 *
11 * @author LiTaiQing
12 */
13 public class TraditionalThreadCommunication {
14
15 /**************************************************
16 * 调试小技巧
17 * 如果由于Console的输出太多而造成面板显示的数据不完整
18 * 可设置运行前参数设置
19 * 右键->Run As->Run Configuractions->Common->File
20 * 选择保存的路径即可
21 *
22 **************************************************
23 */
24
25
26 /**
27 * 面试题
28 * ·子线程循环10次,接着主线程循环100,接着又回到子线程循环10次,
29 * ·接着再回到主线程又循环100,如此循环50次,请写出程序
30 */
31 public static void main(String[] args){
32
33 final Business business = new Business();
34 new Thread(new Runnable(){
35 @Override
36 public void run() {
37 for(int i = 1; i <= 50; i++){
38 business.sub(i);
39 }
40 }
41 }).start();
42 for(int i = 1; i <= 50; i++){
43 business.main(i);
44 }
45 }
46
47 }
48
49 class Business{
50 private boolean bShouldSub = true;
51 public synchronized void sub(int i){
52 /**
53 * 此处将if改为while,增强代码健壮性。
54 * 防止伪唤醒!
55 */
56 while(!bShouldSub){
57 try {
58 this.wait();
59 } catch (InterruptedException e) {
60 e.printStackTrace();
61 }
62 }
63 for(int j = 1; j <= 10; j++){
64 System.out.println("sub thread sequece of " + j + ",loop of " +i);
65 }
66 bShouldSub = false;
67 this.notify();
68 }
69 public synchronized void main(int i){
70 while(bShouldSub){
71 try {
72 this.wait();
73 } catch (InterruptedException e) {
74 e.printStackTrace();
75 }
76 }
77 for(int j = 1; j <= 100; j++){
78 System.out.println("main thread sequece of " + j + ",loop of " +i);
79 }
80 bShouldSub = true;
81 this.notify();
82 }
83 }