java notify 指定_java的notify/notifyAll:如何notify指定的线程?
我嘗試用ArrayList做生產者-消費者問題,有多個生產者,多個消費者,用wait、noitify、notifyAll做并發控制。
當生產者生產完畢后,如何只notify消費者呢?
你確保只有消費者在wait,這樣notify就只會通知消費者了。
話說你為什么要讓生產者去wait呢?
給隊列加一個鎖lock,然后創建兩個Condition,一個是full,處理隊列滿的情況;另一個是empty,處理隊列空的情況。
操作流程是這樣的:
生產者:
1、獲得鎖
2、檢查隊列是否滿,如果滿則等待full condition,直到被消費者喚醒
3、將元素加入隊列
4、notify empty condition,喚醒一個消費者
5、釋放鎖
消費者:
1、獲得鎖
2、檢查隊列是否空,如果空則等待empty condition,直到被生產者喚醒
3、從隊列中取出一個元素
4、notify full condition,喚醒一個生產者
5、釋放鎖。
牢記一點,Condition不是鎖,不存在“鎖定”Condition的情況。
notify被喚醒的線程是隨機的,所以通常是沒辦法指定是誰被喚醒。
根據我的知識水平,我認為能做的辦法有兩點:
1.設置消費者線程的優先級,使用notifyAll,這樣增大消費者線程獲取資源的概率;
2.就是保證生產者執行完后,正在wait的只有消費者;
class BoundedBuffer {
final Lock lock = new ReentrantLock();
final Condition notFull ?= lock.newCondition();
final Condition notEmpty = lock.newCondition();
final Object[] items = new Object[100];
int putptr, takeptr, count;
public void put(Object x) throws InterruptedException {
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
} finally {
lock.unlock();
}
}
public Object take() throws InterruptedException {
lock.lock();
try {
while (count == 0)
notEmpty.await();
Object x = items[takeptr];
if (++takeptr == items.length) takeptr = 0;
--count;
notFull.signal();
return x;
} finally {
lock.unlock();
}
}
}
無法指定線程,notify會喚醒等待該對象的一個線程。
無法指定線程,notify會喚醒等待該對象的一個線程。
總結
以上是生活随笔為你收集整理的java notify 指定_java的notify/notifyAll:如何notify指定的线程?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一万笔记本电脑配置推荐?
- 下一篇: java version 和javac版