私が知りたいのは、例えばr.wait()が動作するかどうかです。このコードでは:notify/wait()で特定の(グループの)スレッドを起床/中断するにはどうすればよいですか?
public class Buffer1<T> {
private T content;
private boolean empty;
private Object r = new Object();
private Object w = new Object();
public Buffer1() {
empty = true; }
public Buffer1(T content) {
this.content = content;
empty = false; }
public T take() throws InterruptedException {
synchronized (r) {
while (empty) {
r.wait();
}
synchronized (w) {
empty = true;
w.notify();
return content;
}
}
}
public void put(T o) throws InterruptedException {
synchronized(w) {
while (!empty) {
w.wait();
}
synchronized (r) {
empty = false;
r.notify();
content = o;
}
はどのようにr.wait()、w.wait()、r.notify()、w.notify()動作しますか?そして、それらは同期(r)/同期(w)とどのように連携しますか?
さて、あなたの人生は 'notifyAll()'によってもっとシンプルになるかもしれません...本当に特定のスレッドグループを起こすことは想定されていません。それは目を覚ます。このため、 'wait()'は常にループ内で発生するはずです。一度目を覚ますと、スレッド自体は目覚めさせるのが良いかどうかをチェックし、そうでなければ 'wait()'に戻ります。しかし、目覚めと通知は、並行プログラミングのための低レベルの構造であり、あなたは本当にコンカレントモジュールを簡単に構成するExecutor Frameworkの使用について考えるべきです。 – scottb
あるいは 'java.util.concurrent'パッケージのセマフォーです。 – EJP