執行緒的互動
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...