Java многопоточный - нить попеременно

Требования:
от механизма синхронизации, СОН () метод, метода Соединить () для реализации отображения анимации;
нить: 1,3,5,7,9
ацетатных тема: 2,4,6,8,10
пропана нить: а, б , С, D, Е
основной () выходной поток: начало нить, конец нити

Выход: начальная нить, 1-а-2 ## 3-б-4 ## 5-с-6 ## ...

Мышление: с
использованием нескольких марок решения, аналога (потребитель - производитель) выхода на поток после ожидания, а затем изменить их разметки
критического ресурса - использовать несколько == putX () == метод, чтобы определить свою собственную метку ( == isEmptyX ==) и выводит
множество исполнительных нитей попеременно заказал
коды:

Ресурс {класс
Private isEmpty01 = Логическое истина;
Private isEmpty02 = Логическое ложь;
Private isEmpty03 = Логическое ложь;

// помещаем методы каждый из которых соответствует одному выходу, каждый выход на ожидание, ждать другие пробуждения
общественной недействительным PUT1 () {
это время ( ! isEmpty01) {
попробовать {
ожидание ();
} улов (InterruptedException E) {
e.printStackTrace ();
}
}
// после выхода
isEmpty01 = ложь;
isEmpty02 = истина;
notifyAll ();
}
общественного недействительными put2 () {
это время ( ! isEmpty02) {
попробовать {
ожидание ();
} улов (InterruptedException E) {
e.printStackTrace ();
}
}
isEmpty02 = ложь;
isEmpty03 = истина;
notifyAll ();
}
Общественного недействительными put3 () { в
то время как (isEmpty03!) {
Попробуйте {
ждать ();
} задвижка (InterruptedException е) {
e.printStackTrace ();
}
}
IsEmpty03 = ложь;
isEmpty01 = TRUE;
notifyAll ();
}
}

Класс Player01 реализует Runnable {

Рез частных ресурсов;
частная String [] обр;
Player01 () {}
Player01 (String [] обр, разреш ресурсов) {
this.arr = обр;
this.res = разреш;
}

Общественного недействительными запуска () {
синхронизировано (Рез) {
для (INT I = 0; я <arr.length; я ++) {
//错误的点
// 61,62,这两句不能交换顺序
res.put1 () ;
System.out.print (обр [я] + "-");
попробуйте {
Thread.sleep (1000);
} задвижка (InterruptedException е) {
e.printStackTrace ();
}
}
}
}
}

Класс Player02 реализует Runnable {

Рез частных ресурсов;
частная String [] обр;
Player02 () {}
Player02 (String [] обр, разреш ресурсов) {
this.arr = обр;
this.res = разреш;
}

Общественного недействительными запуска () {
синхронизировано (Рез) {
для (INT I = 0; я <arr.length; я ++) {
res.put2 ();
System.out.print (обр [я] + "-");
попробуйте {
Thread.sleep (1000);
} задвижка (InterruptedException е) {
e.printStackTrace ();
}
}
}
}
}

Класс Player03 реализует Runnable {

Рез частных ресурсов;
частная String [] обр;
Player03 () {}
Player03 (String [] обр, разреш ресурсов) {
this.arr = обр;
this.res = разреш;
}

Общественного недействительными запуска () {
синхронизировано (Рез) {
для (INT I = 0; я <arr.length; я ++) {
res.put3 ();
System.out.print (обр [я] + "##");
попробуйте {
Thread.sleep (1000);
} задвижка (InterruptedException е) {
e.printStackTrace ();
}
}
}
}
}

Класс Test08 {

государственной статической силы основных (String [] арг) {

String [] arr1 = { "1", "3", "5", "7", "9"};
Строка [] arr2 = { "а", "б", "в", "г", "е"};
Строка [] arr3 = { "2", "4", "6", "8", "0"};

Рез ресурсов = новый ресурс ();

Player01 p1 = новые Player01 (arr1, разрешение);
Player02 р2 = новые Player02 (arr2, разрешение);
Player03 р3 = новые Player03 (arr3, разрешение);

Тема t1 = новый Thread (p1);
Thread t2 = новая тема (p2);
Тема t3 = новая тема (p3);

t1.start ();
t2.start ();
t3.start ();
















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
Результаты:


Важно:
Это использование маркеров может быть достигнуто в течение двух потоков выполнения заказанных поочередно
---------------------

рекомендация

отwww.cnblogs.com/ly570/p/10930949.html