執行緒的互動(No 8)

2021-08-26 04:34:13 字數 2165 閱讀 9817

執行緒的互動

1、基礎知識

三個方法:

notify()喚醒 在此 物件監視器上 等待的 單個 執行緒。

notifyall()::喚醒 在此 物件監視器上 等待的 所有 執行緒。

wait()::導致當前的執行緒等待,直到其他執行緒呼叫此物件的norify()方法或notifyall()方法。

關鍵點是:必須從同步環境內呼叫wait()、notify()、notifyall()方法。執行緒不能呼叫物件上等待或通知的方法,除非它擁有那個物件的鎖。

例:/**

* 計算輸出其他執行緒鎖計算的資料

*/ class threada catch (interruptedexception e)

system.out.println("b物件計算的總和是:" + b.total);

} }

}/**

* 計算1+2+3 ... +100的和

* * @author leizhimin 2008-9-15 13:20:49

*/ class threadb extends thread

//(完成計算了)喚醒在此物件監視器上等待的單個執行緒,在本例中線程a被喚醒

notify();

} }

}千萬注意:

當在物件上呼叫wait()方法時,執行該**的執行緒立即放棄它在物件上的鎖。然而呼叫notify()時,並不意味著這時執行緒會放棄其鎖。如果執行緒仍然在完成同步**,則執行緒在移出之前不會放棄鎖。因此,只要呼叫notify()並不意味著這時該鎖變得可用。

2、norifyall()

如果需要通知等待某個物件的所有執行緒,則用notifyall()讓所有在此物件上等待的執行緒重出等待區,返回到可執行狀態。就好比五個人搶乙個蘋果,當其中乙個人強到之後,另外四個人就會休眠狀態,然後,當那個人把蘋果放下之後notifyall()會被呼叫,使得其它四個人都會甦醒,他們四個就會去強那個蘋果,當又有人強到蘋果之後,wait()方法呼叫,沒有強到蘋果的三個人休眠,強到蘋果的那個人把蘋果放下之後,notifyall()方法被呼叫,以此類推,直到所有的人都搶了一次蘋果為止。

3、生產者消費者模型

對於此模型,應該明確一下幾點:

1、生產者僅僅在倉儲未滿時候生產,倉滿則停止生產。

2、消費者僅僅在倉儲有產品時候才能消費,倉空則等待。

3、當消費者發現倉儲沒產品可消費時候會通知生產者生產。

4、生產者在生產出可消費產品時候,應該通知等待的消費者去消費。

例子:/

public class test catch (interruptedexception e) catch (interruptedexception e) {

e.printstacktrace();

// 滿足消費條件,則進行消費,這裡簡單的更改當前庫存量

curnum -= neednum;

system.out.println("已經消費了" + neednum + "個產品,現倉儲量為" + curnum);

// 喚醒在此物件監視器上等待的所有執行緒

notifyall();

* 生產者

class producer extends thread {

private int neednum; // 生產產品的數量

private godown godown; // 倉庫

producer(int neednum, godown godown) {

this.neednum = neednum;

this.godown = godown;

public void run() {

// 生產指定數量的產品

godown.produce(neednum);

* 消費者

class consumer extends thread {

private int neednum; // 生產產品的數量

private godown godown; // 倉庫

consumer(int neednum, godown godown) {

this.neednum = neednum;

this.godown = godown;

public void run() {

// 消費指定數量的產品

godown.consume(neednum);

Perl學習筆記 No 8

正規表示式的應用 1.只是m 的簡寫,http 不易閱讀,可以寫成 m或者m http 2.正斜線不是元字元,如果它不是分隔符,則不需在前面使用反斜線 3.fred i,表示無視大小寫,可以匹配fred,fred,fred,fred等 4.不能匹配換行符,但是加上s後,即能匹配所有字元,比如 f.s...

NO 8 記憶體 結構體

乙個程式一般分為3段 text段,data段,bss段 text段 就是放程式 的,編譯時確定,唯讀。data段 存放在編譯階段 而非執行時 就能確定的資料,可讀可寫。bss段 定義而沒有賦初值的全域性變數和靜態變數,放在這個區域。乙個程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器...

No 8進製 檔案操作

進製 檔案操作 開啟檔案 f open 檔案路徑 mode r w a encoding 原檔案寫入時定義的編碼 操作data f.read 讀取檔案的內容到記憶體 全部 f.write 要寫入的內容 關閉f.close 位元組流寫入 示例一 一般用於文字寫入 f open a.txt mode w...