Javaのスレッドに関して質問です
Assistantクラスを使い待機状態と再開を確認できるプログラムの作成
loafとrestartメソッドを設ける
workメソッドが呼ばれる度loafを呼び出す
Managerクラスを定義
checkメソッドを設け、Assistantをcheckし続ける
loaf状態ならrestartさせる
(Managerクラスはデーモンスレッド)
ということなんですが、いまいちうまくいきません
さぼっても復帰してくれません
public class Assistant implements Runnable {
private String name;
private Chore c;
public Assistant(String name, Chore c) {
this.name = name;
this.c = c;
}
public void run() { work(); }
public void work() {
while (true) {
synchronized (c) {
if (c.doEnd()) break;
System.out.println(name + " : " + c.digest());
loaf();
}
}
}
public synchronized void loaf() {
try { c.wait(); }
catch (InterruptedException e) { e.printStackTrace(); }
}
public synchronized void restart() { c.notify(); }
}
public class Chore {
private String name;
private int step;
private int id;
public Chore(String name) {
this.name = name;
this.step = this.name.length();
this.id = 0;
}
public synchronized String digest() {
String message = "" + id + name.charAt(id);
try { Thread.sleep(500); }
catch (InterruptedException ie) { }
id++;
return message;
}
public synchronized boolean doEnd() { return id >= step; }
}
public class Manager extends Thread {
private String name;
private Assistant a;
public Manager(String name) { this.name = name; }
public void run() { check(); }
public void check() { a.restart(); }
}
public class Test {
public static void main(String[] args) {
Chore[] ch = { new Chore("掃除"), new Chore("プリント印刷"), new Chore("出欠データ入力") };
Assistant[] a = { new Assistant("あ", ch[0]), new Assistant("\tい", ch[1]), new Assistant("\t\tう", ch[2] };
Thread[] t = new Thread[a.length];
for (int i = 0; i < t.length; i++) {
t[i] = new Thread(a[i]);
}
for (int i = 0; i < t.length; i++) {
t[i].start();
}
Manager m = new Manager("監査");
m.setDaemon(true);
m.start();
for (int i = 0; i < t.length; i++) {
try {
t[i].join();
} catch( InterruptedException ie ) {
}
}
}
お礼
今更ですがありがとうございました。
補足
回答ありがとうございます! うーむ。やはり無いんでしょうかねぇ。 確かにスレッドセーフ、イミュータブル等で検索した限りでは見つけられなかったです。