java notify 指定_java的notify/notifyAll:如何notify指定的线程?
我嘗試用ArrayList做生產(chǎn)者-消費(fèi)者問題,有多個(gè)生產(chǎn)者,多個(gè)消費(fèi)者,用wait、noitify、notifyAll做并發(fā)控制。
當(dāng)生產(chǎn)者生產(chǎn)完畢后,如何只notify消費(fèi)者呢?
你確保只有消費(fèi)者在wait,這樣notify就只會(huì)通知消費(fèi)者了。
話說你為什么要讓生產(chǎn)者去wait呢?
給隊(duì)列加一個(gè)鎖lock,然后創(chuàng)建兩個(gè)Condition,一個(gè)是full,處理隊(duì)列滿的情況;另一個(gè)是empty,處理隊(duì)列空的情況。
操作流程是這樣的:
生產(chǎn)者:
1、獲得鎖
2、檢查隊(duì)列是否滿,如果滿則等待full condition,直到被消費(fèi)者喚醒
3、將元素加入隊(duì)列
4、notify empty condition,喚醒一個(gè)消費(fèi)者
5、釋放鎖
消費(fèi)者:
1、獲得鎖
2、檢查隊(duì)列是否空,如果空則等待empty condition,直到被生產(chǎn)者喚醒
3、從隊(duì)列中取出一個(gè)元素
4、notify full condition,喚醒一個(gè)生產(chǎn)者
5、釋放鎖。
牢記一點(diǎn),Condition不是鎖,不存在“鎖定”Condition的情況。
notify被喚醒的線程是隨機(jī)的,所以通常是沒辦法指定是誰被喚醒。
根據(jù)我的知識(shí)水平,我認(rèn)為能做的辦法有兩點(diǎn):
1.設(shè)置消費(fèi)者線程的優(yōu)先級(jí),使用notifyAll,這樣增大消費(fèi)者線程獲取資源的概率;
2.就是保證生產(chǎn)者執(zhí)行完后,正在wait的只有消費(fèi)者;
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會(huì)喚醒等待該對(duì)象的一個(gè)線程。
無法指定線程,notify會(huì)喚醒等待該對(duì)象的一個(gè)線程。
總結(jié)
以上是生活随笔為你收集整理的java notify 指定_java的notify/notifyAll:如何notify指定的线程?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一万笔记本电脑配置推荐?
- 下一篇: java的jdbc驱动server_wi