//乙個同步程式,生產者向乙個緩衝區(定義為三個位元組)中寫入資料,消費者從中提取數//據,如果緩衝區中沒有資料,那麼consumer只好wait,進入等待狀態,當另乙個執行緒(也就是
//生產者)向緩衝區中寫入資料猴,執行了monitor.pulse,喚醒了consumer的等待,開始讀取
//資料.反之,當producer寫入資料的時候,如果緩衝區已滿,那麼只好進入等待狀態,當另一
//個執行緒(也就是消費者)從中讀取了資料,緩衝區有了空間,那麼消費者執行
喚醒生產者,繼續寫入資料.
//程式使用了lock來鎖定共享資料區,而不是使用monitor.enter和monitor.exit,因為你可
//能很容易忘記enter後exit掉,而lock則是隱式的執行了exit,所以建議用lock.
//當然,在程式執行的過程中,因為是執行緒,所以執行結果是不可再現的!!每次可能執行的順
//序有很多種!!
//定義了四個類:
//第乙個類letsynchronized,主要用來訪問資料,並且在訪問的時候,加上了共享鎖.
//第二個類producer,生產者,呼叫乙個letsynchronized類的例項的setbuffer方法來存放
//資料.
//第三個類consumer,消費者, 呼叫乙個letsynchronized類的例項的getbuffer方法來存放
//資料.
//第四個類threadstart,測試類,也是這個cs中的啟動類,定義了letsynchornized例項,然
//後傳遞給了producer和consumer,然後定義了兩個執行緒,執行緒啟動的是producer
//的produce方法和consumer的consume方法,最後啟動這兩個執行緒.
using system;
using system.threading;
//letsynchronized用來存放和取出緩衝區變數
public class letsynchronized
;//定義了只有三個位元組的緩衝區
private int buffercount=0;
//確認緩衝區內已放數值的個數
private int readlocation=0,writelocation=0;
//確定讀寫的位置
public letsynchronized()
public int getbuffer()
//判斷如果緩衝區內無內容,則consumer進入wait狀態,並且釋放物件鎖
int readvalue=buffer[readlocation];
buffercount--;
//已經從緩衝區讀取了內容,所以buffercount要進行自減.
readlocation=(readlocation+1)%buffer.length;
//求餘的目的是為了迴圈使用緩衝區
monitor.pulse(this);
//通知物件的第乙個等待執行緒可以從waitsleepjoin轉換到started狀態.
return readvalue;
//返回給consumer取出的數值}}
public void setbuffer(int writevalue) //將資料放入緩衝區
//如果緩衝區已滿,那麼進入waitsleepjoin狀態
buffer[writelocation]=writevalue;
//向緩衝區寫入資料
buffercount++;
//自加,代表緩衝區現在到底有幾個資料
writelocation=(writelocation+1)%buffer.length;
//用%實現緩衝區的迴圈利用
monitor.pulse(this);
//喚醒waitsleepjoin狀態的程序,到started狀態
}//使用lock隱式的釋放了共享鎖}}
public class producer //生產者類,向緩衝區中放入資料
//此處建構函式的作用是在啟動類中呼叫producer的時候,把啟動類中定義的sharedlocation傳過來
public void produce()//定義生產過程
//將資料放入緩衝區
string name=thread.currentthread.name;
//得到當前執行緒的名字
console.writeline(name+"done producing");
//此執行緒執行完畢}}
public class consumer//定義消費者類
//定義建構函式,負責傳遞啟動類中的shared
public void consume()
//從緩衝區中迴圈讀取
string name=thread.currentthread.name;
//取得當前執行緒的名字
console.writeline(name+"done consuming");}}
public class threadtest //設定為啟動類
Linux 中生產者與消費者問題
條件變數condition variable 乙個condition variable總是和乙個mutex搭配使用的。乙個執行緒可以呼叫pthread cond wait在乙個condition variable上阻塞等待,這個函式做以下三步操作 釋放mutex 不滿足條件時必須進行休眠 進行阻塞式...
執行緒中生產者和消費者
package com.thread.p c public class valueobject package com.thread.p c public class p public void setvalue string value system.currenttimemillis syste...
生產者消費者問題
public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...