Java多執行緒程式設計之多生產多消費者示例

2021-08-04 19:19:23 字數 3179 閱讀 6502

示例:分別建立並啟動五個線性用於生產雞蛋,消費雞蛋;且雞蛋最多可以有10個,消費雞蛋只能是生產好了的雞蛋,完成一邊生產雞蛋,一邊消費雞蛋的模型。

建立乙個雞蛋資源類eggres,該類中封裝有雞蛋個數count,行為有生產雞蛋,消費雞蛋兩個方法,

用同步鎖來解決同步問題,等待喚醒機制完成執行緒間通訊,正常完成多生產多消費功能實現;

雞蛋資源類eggres**如下:

class eggres  catch (interruptedexception e) 

} try catch (interruptedexception e)

system.out.println("執行緒" + thread.currentthread().getname() + ",生產了雞蛋:" + ++count );

//每次生產一次雞蛋,該執行緒就釋放出鎖,給予其他生產線程,消費執行緒競爭鎖的機會

try catch (interruptedexception e1)

//此時,消費執行緒肯定為喚醒狀態,那麼喚醒所有執行緒

notifyall();

} }

public void consumer() catch (interruptedexception e)

}//模擬消費雞蛋需要耗時2s,這裡執行緒沒有釋放出鎖

try catch (interruptedexception e)

system.out.println("執行緒" + thread.currentthread().getname() + ",消費了雞蛋:" + count--);

//每次消費一次雞蛋,該執行緒就釋放出鎖,給予其他生產線程,消費執行緒競爭鎖的機會

try catch (interruptedexception e1)

//此時,生產線性必須為喚醒狀態,喚醒全部執行緒

notifyall();

}}

}

生產線程類和消費執行緒類需要共享雞蛋資源類eggres的資料,於是通過建構函式傳參獲取共享資料;**如下:

//生產線程

class myproductthread extends thread

@override

public void run() }}

//消費執行緒

class myconsumerthread extends thread

@override

public void run()

}}

主函式呼叫如下:

public class mulproduct2consumer 

myconsumerthread mcts = new myconsumerthread[5];

for (int i = 0; i < mcts.length; i++)

}}

完整**如下:

public class mulproduct2consumer 

myconsumerthread mcts = new myconsumerthread[5];

for (int i = 0; i < mcts.length; i++)

}}//雞蛋類

class eggres catch (interruptedexception e)

} try catch (interruptedexception e)

system.out.println("執行緒" + thread.currentthread().getname() + ",生產了雞蛋:" + ++count );

//每次生產一次雞蛋,該執行緒就釋放出鎖,給予其他生產線程,消費執行緒競爭鎖的機會

try catch (interruptedexception e1)

//此時,消費執行緒肯定為喚醒狀態,那麼喚醒所有執行緒

notifyall();

} }

public void consumer() catch (interruptedexception e)

}//模擬消費雞蛋需要耗時2s,這裡執行緒沒有釋放出鎖

try catch (interruptedexception e)

system.out.println("執行緒" + thread.currentthread().getname() + ",消費了雞蛋:" + count--);

//每次消費一次雞蛋,該執行緒就釋放出鎖,給予其他生產線程,消費執行緒競爭鎖的機會

try catch (interruptedexception e1)

//此時,生產線性必須為喚醒狀態,喚醒全部執行緒

notifyall();

}}

}//生產線程

class myproductthread extends thread

@override

public void run() }}

//消費執行緒

class myconsumerthread extends thread

@override

public void run()

}}

擷取部分列印結果:

執行緒thread-3,生產了雞蛋:1

執行緒thread-5,消費了雞蛋:   1

執行緒thread-4,生產了雞蛋:1

執行緒thread-2,生產了雞蛋:2

執行緒thread-1,生產了雞蛋:3

執行緒thread-4,生產了雞蛋:4

執行緒thread-5,消費了雞蛋:   4

執行緒thread-3,生產了雞蛋:4

執行緒thread-9,消費了雞蛋:   4

執行緒thread-0,生產了雞蛋:4

執行緒thread-9,消費了雞蛋:   4

執行緒thread-3,生產了雞蛋:4

執行緒thread-5,消費了雞蛋:   4

執行緒thread-4,生產了雞蛋:4

執行緒thread-1,生產了雞蛋:5

執行緒thread-2,生產了雞蛋:6

執行緒thread-8,消費了雞蛋:   6

執行緒thread-6,消費了雞蛋:   5

執行緒thread-7,消費了雞蛋:   4

執行緒thread-8,消費了雞蛋:   3

Python多執行緒程式設計之多執行緒加鎖

python語言本身是支援多執行緒的,不像php語言。下面的例子是多個執行緒做同一批任務,任務總是有task num個,每次執行緒做乙個任務 print 做完後繼續取任務,直到所有任務完成為止。1 coding utf 8 2import threading 34 start task 0 5 ta...

Java之多執行緒之鎖重入

一 什麼叫鎖重入 1.在多執行緒同步中,使用synchronized進行同步處理時,會對物件加鎖處理,啟用物件的互斥唯一性。2.在乙個執行緒執行到同步 並獲得物件的鎖時,如果在該同步 內部又繼續呼叫了本類的其他同步方法,也可以執行 這就表明了鎖重入。3。當乙個執行緒得到乙個物件的鎖後,再次請求該物件...

Linux網路程式設計之多執行緒

多執行緒模型 在多執行緒模型下,注意共享資料的同步,mutex condition variable rw lock等的使用,local thread storage的使用,另外,可以搭配執行緒池處理非同步計算任務。在c 11中的執行緒庫中已經提供了future相關的工具,合理地使用執行緒模型減少資...