多執行緒(五) 執行緒的通訊

2021-10-09 02:12:48 字數 2003 閱讀 8747

例題:使用兩個執行緒列印1-100。執行緒1,執行緒2交替列印。

/**

* 執行緒通訊的例子:使用兩個執行緒列印1-100.執行緒1,執行緒2,交替列印。

* */

class

number

implements

runnable

catch

(interruptedexception e)

system.out.

println

(thread.

currentthread()

.getname()

+":"

+number)

; number++

;try

catch

(interruptedexception e)

}else}}

}}public

class

communicationtest

}

相同點:一旦執行方法,都可以使得當前狀態的執行緒進入阻塞狀態。

不同點:

1)兩個方法宣告的位置不同:thread類中宣告sleep(),object類中宣告wait()。

2)呼叫的要求不同:sleep()可以在任何需要的場景下呼叫。wait必須使用在同步**塊和同步方法中使用。

3)關於是否釋放同步監視器:如果兩個方法都使用在同步**或同步方法中,sleep()不會釋放鎖,wait()會釋放鎖。

/**

* 執行緒通訊的應用:經典例題:生產者/消費者問題

* *生產者(productor)將產品交給店員(clerk),而消費者(customer)從店員處取走產品,店員一次

* 如果店中有空位放產品了在通知生產者繼續生產;如果店中沒有產品了,店員會告訴消費者等一下,如果店中

* 有產品了在通知消費者來取走產品。

* * 分析:

* 1.是否是多個執行緒問題? 是,生產者執行緒,消費者執行緒。

* 2.是否與共享資料? 是,店員(或產品)

* 3.如何解決執行緒安全的問題? 同步機制,有三種方法

* 4.是否涉及執行緒的通訊? 是

*/class

clerk

else

catch

(interruptedexception e)}}

//消費產品

public

synchronized

void

consumeproduct()

else

catch

(interruptedexception e)}}

}class

producer

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)

clerk.

produceproduct()

;}}}

class

consumer

extends

thread

@override

public

void

run(

)catch

(interruptedexception e)

clerk.

consumeproduct()

;}}}

public

class

producttest

}

執行結果:

多執行緒(五) 執行緒間的通訊(等待喚醒機制)

多個執行緒在處理同一資源,但是任務卻不同。1,wait 讓執行緒處於凍結狀態,被wait的執行緒會被儲存到執行緒池中。2,notify 喚醒執行緒池中乙個執行緒 任意 3,notifyall 喚醒執行緒池中的所有執行緒。這些方法都必須定義在同步中,因為這些方法是用於操作執行緒狀態的方法,必須要明確到...

Android多執行緒(五) 執行緒池的使用

執行緒池是儲存了一定量執行緒的區域,能夠對執行緒進行簡單的管理,支援迴圈執行和定時執行,使用執行緒池能夠減少執行緒建立和銷毀時的開銷。在例項化threadpoolexecutor時通過配置6個引數來實現不同功能的執行緒池。引數作用 corepoolsize 核心執行緒數 maximumpoolsiz...

linux多執行緒學習筆記五 執行緒安全

一,執行緒安全基礎 乙個函式被稱為執行緒安全的當且僅當被多個併發執行緒反覆呼叫時,它會一直產生正確的結果。我們能夠定義出四類執行緒不安全函式。第一類 不保護共享變數的函式 共享變數在多執行緒中是共享資料,可以通過同步機制來保護共享資料。第二類 保護跨越多個呼叫狀態的函式 乙個偽隨機數生成器是乙個簡單...