teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追記2

2021/12/15 04:26

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -60,4 +60,41 @@
60
60
  synchronized(lock) { lock.notify(); }
61
61
  }
62
62
  }
63
+ ```
64
+ **追記2**
65
+ xebme さんから指摘があり、何度も実行を繰り返して試してみたら、
66
+ *+ を 1000個出し終わる前に途中で止まってしまうことがありました。
67
+
68
+ やはり、自分のスレッドで wait して、相手のスレッドに notify する方が良いと思います。
69
+ でも、setThread は面倒なので、コンストラクタで次に実行するするスレッドの
70
+ 番号を設定することにしました。
71
+ ```Java
72
+ public class PrintThread extends Thread {
73
+
74
+ private String message;
75
+ private static Thread[] t = new Thread[2];
76
+ private int next;
77
+
78
+ public PrintThread(String message, int next) {
79
+ this.message = message;
80
+ this.next = next;
81
+ }
82
+
83
+ public synchronized void run() {
84
+ for (int i = 0; i < 1000; i++) {
85
+ try { wait(); } catch (InterruptedException e) { }
86
+ System.out.print(message);
87
+ synchronized(t[next]) { t[next].notify(); }
88
+ }
89
+ }
90
+
91
+ public static void main(String[]args) {
92
+ t[0] = new PrintThread("*", 1);
93
+ t[0].start();
94
+ t[1] = new PrintThread("+", 0);
95
+ t[1].start();
96
+ try { Thread.sleep(100); } catch (InterruptedException e) { }
97
+ synchronized(t[0]) { t[0].notify(); }
98
+ }
99
+ }
63
100
  ```

1

追記

2021/12/15 04:26

投稿

kazuma-s
kazuma-s

スコア8222

answer CHANGED
@@ -29,4 +29,35 @@
29
29
  synchronized(p1) { p1.notify(); }
30
30
  }
31
31
  }
32
+ ```
33
+ **追記**
34
+ setThread が面倒なので、質問のコードにあったように
35
+ lockオブジェクトで同期を取ることにしました。
36
+ ```Java
37
+ public class PrintThread extends Thread {
38
+
39
+ private String message;
40
+ private static Object lock = new Object();
41
+
42
+ public PrintThread(String message) { this.message = message; }
43
+
44
+ public void run() {
45
+ for (int i = 0; i < 1000; i++) {
46
+ synchronized(lock) {
47
+ try { lock.wait(); } catch (InterruptedException e) { }
48
+ System.out.print(message);
49
+ lock.notify();
50
+ }
51
+ }
52
+ }
53
+
54
+ public static void main(String[]args) {
55
+ PrintThread p1 = new PrintThread("*");
56
+ p1.start();
57
+ PrintThread p2 = new PrintThread("+");
58
+ p2.start();
59
+ try { Thread.sleep(100); } catch (InterruptedException e) { }
60
+ synchronized(lock) { lock.notify(); }
61
+ }
62
+ }
32
63
  ```