回答編集履歴

2

追記2

2021/12/15 04:26

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -123,3 +123,77 @@
123
123
  }
124
124
 
125
125
  ```
126
+
127
+ **追記2**
128
+
129
+ xebme さんから指摘があり、何度も実行を繰り返して試してみたら、
130
+
131
+ *+ を 1000個出し終わる前に途中で止まってしまうことがありました。
132
+
133
+
134
+
135
+ やはり、自分のスレッドで wait して、相手のスレッドに notify する方が良いと思います。
136
+
137
+ でも、setThread は面倒なので、コンストラクタで次に実行するするスレッドの
138
+
139
+ 番号を設定することにしました。
140
+
141
+ ```Java
142
+
143
+ public class PrintThread extends Thread {
144
+
145
+
146
+
147
+ private String message;
148
+
149
+ private static Thread[] t = new Thread[2];
150
+
151
+ private int next;
152
+
153
+
154
+
155
+ public PrintThread(String message, int next) {
156
+
157
+ this.message = message;
158
+
159
+ this.next = next;
160
+
161
+ }
162
+
163
+
164
+
165
+ public synchronized void run() {
166
+
167
+ for (int i = 0; i < 1000; i++) {
168
+
169
+ try { wait(); } catch (InterruptedException e) { }
170
+
171
+ System.out.print(message);
172
+
173
+ synchronized(t[next]) { t[next].notify(); }
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+
181
+ public static void main(String[]args) {
182
+
183
+ t[0] = new PrintThread("*", 1);
184
+
185
+ t[0].start();
186
+
187
+ t[1] = new PrintThread("+", 0);
188
+
189
+ t[1].start();
190
+
191
+ try { Thread.sleep(100); } catch (InterruptedException e) { }
192
+
193
+ synchronized(t[0]) { t[0].notify(); }
194
+
195
+ }
196
+
197
+ }
198
+
199
+ ```

1

追記

2021/12/15 04:26

投稿

kazuma-s
kazuma-s

スコア8224

test CHANGED
@@ -61,3 +61,65 @@
61
61
  }
62
62
 
63
63
  ```
64
+
65
+ **追記**
66
+
67
+ setThread が面倒なので、質問のコードにあったように
68
+
69
+ lockオブジェクトで同期を取ることにしました。
70
+
71
+ ```Java
72
+
73
+ public class PrintThread extends Thread {
74
+
75
+
76
+
77
+ private String message;
78
+
79
+ private static Object lock = new Object();
80
+
81
+
82
+
83
+ public PrintThread(String message) { this.message = message; }
84
+
85
+
86
+
87
+ public void run() {
88
+
89
+ for (int i = 0; i < 1000; i++) {
90
+
91
+ synchronized(lock) {
92
+
93
+ try { lock.wait(); } catch (InterruptedException e) { }
94
+
95
+ System.out.print(message);
96
+
97
+ lock.notify();
98
+
99
+ }
100
+
101
+ }
102
+
103
+ }
104
+
105
+
106
+
107
+ public static void main(String[]args) {
108
+
109
+ PrintThread p1 = new PrintThread("*");
110
+
111
+ p1.start();
112
+
113
+ PrintThread p2 = new PrintThread("+");
114
+
115
+ p2.start();
116
+
117
+ try { Thread.sleep(100); } catch (InterruptedException e) { }
118
+
119
+ synchronized(lock) { lock.notify(); }
120
+
121
+ }
122
+
123
+ }
124
+
125
+ ```