要求:
借助同步機制,sleep()方法,join()方法,實作動畫顯示;
甲線程:1、3、5、7、9
乙線程:2、4、6、8、10
丙線程:a、b、c、d、e
main()線程輸出:線程開始,線程結束
輸出結果:線程開始,1-a-2## 3-b-4## 5-c-6## …
思考:
使用多個判斷标記,模拟(消費者-生産者)每線程輸出一個後就等待,然後改變自己的标記
臨界資源–使用多個== putX() == 方法,判斷屬于自己的标記(== isEmptyX ==)然後輸出
使多個線程有序的交替執行
代碼:
class Resource{
private boolean isEmpty01 = true;
private boolean isEmpty02 = false;
private boolean isEmpty03 = false;
//每個put方法對應一個輸出,每輸出一個就等待,等待其他人的喚醒
public void put1(){
while(!isEmpty01){
try{
wait();
}catch(InterruptedException e){
e.printStackTrace();
}
//輸出後
isEmpty01 = false;
isEmpty02 = true;
notifyAll();
public void put2(){
while(!isEmpty02){
isEmpty02 = false;
isEmpty03 = true;
public void put3(){
while(!isEmpty03){
isEmpty03 = false;
isEmpty01 = true;
class Player01 implements Runnable{
private Resource res;
private String[] arr;
Player01(){}
Player01(String[] arr,Resource res){
this.arr = arr;
this.res = res;
public void run(){
synchronized(res){
for(int i=0;i<arr.length;i++){
//錯誤的點
//61,62,這兩句不能交換順序
res.put1();
System.out.print(arr[i]+"-");
Thread.sleep(1000);
class Player02 implements Runnable{
Player02(){}
Player02(String[] arr,Resource res){
res.put2();
class Player03 implements Runnable{
Player03(){}
Player03(String[] arr,Resource res){
res.put3();
System.out.print(arr[i]+"## ");
class Test08{
public static void main(String[] args){
String[] arr1 = {"1","3","5","7","9"};
String[] arr2 = {"a","b","c","d","e"};
String[] arr3 = {"2","4","6","8","0"};
Resource res = new Resource();
Player01 p1 = new Player01(arr1,res);
Player02 p2 = new Player02(arr2,res);
Player03 p3 = new Player03(arr3,res);
Thread t1 = new Thread(p1);
Thread t2 = new Thread(p2);
Thread t3 = new Thread(p3);
t1.start();
t2.start();
t3.start();
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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
執行結果:
重要的是:
這種利用标記可以實作超過2個線程的有序交替執行
---------------------