日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java notify 指定_java的notify/notifyAll:如何notify指定的线程?

發布時間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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指定的线程?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。