示例:分別建立並啟動五個線性用於生產雞蛋,消費雞蛋;且雞蛋最多可以有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相關的工具,合理地使用執行緒模型減少資...