一道经典的面试题目:两个线程,分别打印AB,其中线程A打印A,线程B打印B,各打印10次,使之出现ABABABABA.. 的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
package com.shangshe.path; public class ThreadAB { /** * @param args */ public static void main(String[] args) { final Print business = new Print(); new Thread( new Runnable() { public void run() { for ( int i= 0 ;i< 10 ;i++) { business.print_A(); } } }).start(); new Thread( new Runnable() { public void run() { for ( int i= 0 ;i< 10 ;i++) { business.print_B(); } } }).start(); } } class Print { private boolean flag = true ; public synchronized void print_A () { while (!flag) { try { this .wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print( "A" ); flag = false ; this .notify(); } public synchronized void print_B () { while (flag) { try { this .wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print( "B" ); flag = true ; this .notify(); } } |
由上面的例子我们可以设计出3个线程乃至于n个线程的程序,下面给出的例子是3个线程,分别打印A,B,C 10次,使之出现ABCABC.. 的效果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
public class ThreadABC { /** * @param args */ public static void main(String[] args) { final Print business = new Print(); new Thread( new Runnable() { public void run() { for ( int i= 0 ;i< 100 ;i++) { business.print_A(); } } }).start(); new Thread( new Runnable() { public void run() { for ( int i= 0 ;i< 100 ;i++) { business.print_B(); } } }).start(); new Thread( new Runnable() { public void run() { for ( int i= 0 ;i< 100 ;i++) { business.print_C(); } } }).start(); } } class Print { private boolean should_a = true ; private boolean should_b = false ; private boolean should_c = false ; public synchronized void print_A () { while (should_b || should_c) { try { this .wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print( "A" ); should_a = false ; should_b = true ; should_c = false ; this .notifyAll(); } public synchronized void print_B () { while (should_a || should_c) { try { this .wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print( "B" ); should_a = false ; should_b = false ; should_c = true ; this .notifyAll(); } public synchronized void print_C () { while (should_a || should_b) { try { this .wait(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.out.print( "C" ); should_a = true ; should_b = false ; should_c = false ; this .notifyAll(); } } |
再一次证明了软件工程的重要性了;在多线程程序中,应该说在程序中,我们应该把那些业务逻辑代码放到同一个类中,使之高内聚,低耦合