執行緒的基本協作機制

2021-08-28 07:06:48 字數 3549 閱讀 1646

接下來講述執行緒中的基本協作機制:

1.生產消費模型;

2.同時開始;

3.等待結束;

4.集合點。

首先介紹object類中的wait/notify方法:

public  final  void  wait()  throws  interruptedexception;

public  final  void  wait(long timeout)  throws  interruptedexception;

上述的兩個方法中乙個帶引數,乙個不帶引數。

帶時間引數,單位是毫秒,表示最多等待這麼長的時間,引數為0表示無限期等待;

不帶時間引數,表示無限期等待;

除了用於鎖的等待佇列,每個執行緒還有另乙個等待佇列,表示條件佇列;當呼叫wait方法就會把當前執行緒放入該佇列中,他需要等待乙個條件,這個太條件他自己改變不了,需要其他執行緒改變嗎。

public  final  native  void  notify();

public  final  native  void  notifyall();

當執行緒在呼叫wait方法之後,需要等待乙個條件,當其他條件改變後,需要呼叫notify方法;

notify就是從條件佇列中選中乙個執行緒將其從佇列移除並喚醒;

notifyall會移除所有的執行緒並喚醒它們。

看下面的例子:

public class main extends thread  

}system.out.println("flag");

}catch (interruptedexception e)

}public synchronized void setflag()

public static void main(string args) throws interruptedexception

}

上面**中有兩個執行緒,主線程和創造出來的執行緒;被創造的執行緒等待變數變為true,在不為true的時候,一直在wait(),主線程把該變數變為true,並呼叫notify方法。

wait/notify方法只能在synchronized**塊內被呼叫;

雖然是在synchronized方法內,但呼叫wait方法的時候,執行緒會釋放物件鎖;

wait/notify方法被不同的執行緒呼叫,但共享相同的鎖和條件等待佇列,圍繞乙個共享的條件變數進行協作。

1.生產者/消費者模型

生產者往乙個容器內放資料,如果滿了就wait(),消費者從容器內取資料,如果空了就wait()。

class myblockingqueue

public synchronized void put(e e) throws interruptedexception

queue.add(e);

notifyall();

}public synchronized e take() throws interruptedexception

e e = queue.poll();

notifyall();

return e;

}}

上面**相當於乙個倉庫,limit相當於倉庫的容量,倉庫滿了,生產者就wait,倉庫空了,消費者就wait。

當倉庫不為滿的時候,生產者向倉庫中放資料;

class producer implements runnable

@override

public void run()

}catch (interruptedexception e)

}}

上面為乙個簡單的生產者模型,迴圈向倉庫裡生產資料;

當倉庫為空的時候,消費者不再向倉庫取資料:

class consumer implements runnable

@override

public void run()

}catch (interruptedexception e)

}}

上面為乙個簡單的消費者模型,迴圈向倉庫取資料。

public static void main(string args)
啟動該模型後,會發現生產者和消費者交替出現。

2.同時開始

相當於比賽場上,運動員聽到裁判的槍聲然後一起出發的過程;

class fireflag

}public synchronized void setfired()

}

上述**相當於一把訊號槍的作用,每個執行緒在fired為false的時候,都必須等待,當槍響的時候所有執行緒就同時執行;

class racer implements runnable

@override

public void run() catch (interruptedexception e)

}}

上面的**是運動員的角色,每乙個執行緒都要以「槍」來變換自身的狀態;

public static void main(string args) throws interruptedexception

public synchronized void await() throws interruptedexception

}public synchronized void countdown()

}}class worker implements runnable

@override

public void run() catch (interruptedexception e)

}}public class main

public synchronized void await() throws interruptedexception else }}

}}public class main

@override

public void run() catch (interruptedexception e) }}

public static void main(string args) throws interruptedexception {

int num =10;

thread to = new thread[num];

assemblepoint ap = new assemblepoint(num);

for(int i = 0;i上述**,建立了是個執行緒,然後每個執行緒都會執行自己的任務,執行完之後同意呼叫await方法到達集合點,進行等待,當所有執行緒都執行完了自己的任務,就會被喚醒。這個機制跟上述的等待結束機制有些相似,但卻又不一樣,上述等待機制是主線程等待由它建立的所有執行緒都結束為目的;集合點機制,就像是乙個小分隊裡面自覺等待隊友集合完畢,很相似,但是又很不一樣。

以上就是我對執行緒間基本的協作機制的一點了解,其實執行緒還可以組合起來做很多事情,就如同乙個遊戲還有無限種方法等著我們去開發出來。

好了,不說了,敲**了!!!

執行緒 同步執行緒和協作執行緒

1 同步塊 實現 package edu.xalead public class 吃包子 extends thread public synchronized void eat public void run catch interruptedexception e 多執行緒的爭用問題 會出現兩個執...

執行緒 執行緒協作 管程法

wait 讓執行緒堵塞 notifyall 通知執行緒接觸堵塞mq 的思想,列 生產者生產,消費者消費,通過緩衝區 生產者生產100個摸頭,消費者買饅頭。消費者從緩衝區取饅頭,如果饅頭已賣完,就進入等待,等生產者做饅頭,放到容器裡,再通知消費者取饅頭,如果生產者已經再容器裡生產100個 則 進入等待...

執行緒間的協作同步

幫朋友看時候學了一下這方面知識 有錯誤請糾正 wait notify 和notifyall condition 在condition物件中,與wait,notify和notifyall方法對應的分別是await,signal,signalall。但是,condition對object進行了擴充套件,...