public synchronized void push(WoTou wt) {
while(index == arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index] = wt;
index ++;
}这是一个生产者线程的一部分,我的理解应该是:满了之后就用wait()阻塞,之后用notify()去唤醒消费者线程。但是wait()之后是不是应该就阻塞住了啊?我感觉有点矛盾呢,不知道我哪里理解有误,高手指点一下 多谢!
放在while里面呢。这样就可以做到index == arrWT.length成立时去唤醒,不用每次都唤醒!public synchronized void push(WoTou wt) {
while(index == arrWT.length) {
try {
this.notifyAll();
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
arrWT[index] = wt;
index ++;
}
java多线程设计模式,铁道出版社,结城浩著 博硕文化译 日本人写的 个人感觉非常通俗易懂
public synchronized void push(WoTou wt) {
while (index != arrWT.length) {
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.notifyAll();
arrWT[index] = wt;
index++;
}也就是应该是不等的时候wait。但即使这样我觉得也不应该在push前加synchronized修饰恐怕需要更多的代码才能判断
等到消费者唤醒生产者时,生产者从wait()处继续往下执行.1L的代码表示满了就休息(wait),每生产一个就叫所有消费者,消费者进来消费,而生产者则阻塞知道消费者唤醒它。 LZ是担心的应该是满了就阻塞,没法叫消费者了,但实际上每生产一个就叫一次消费者,所以生产者阻塞后,肯定有消费者来消费,继而叫醒生产者.4L的代码是只有满了才叫消费者.两个都是可行的,个人更喜欢4L的。
1. 我想put个任务给生产者线程(假说产者线程就是张三)。
2. 张三发现他已经满负荷了,于是让我等待 (this.wait(); 就是这个意思。)
3.这样我就一直等啊等,直到有另外一个人(王五,他是个消费者)他消费掉了一个东东,就是说张三现在有闲了。 王五肯定会发个notify给我的 (就是 调用 张三的notify()方法啦)
4。这样我就从wait状态继续了,
this.notifyAll();
arrWT[index] = wt;
index++;
这三句就是说,我现在放了个东西进去了,通知王五去处理.
例子中,
我,王五 都是线程。
而 张三 只是个仓库(容器), 我跟王五都跟这个张三仓库有关系。