生產者和消費者是一種經典的供求案例,生產者和消費者執行緒之間的關係涉及執行緒之間的互動。生產者執行緒產生的資料項,將來會被消費者消費,每個生產出來的資料會被儲存在乙個共享的倉庫中。
假設執行緒以不同的速度進行,那麼將會導致消費者可能獲取到還未生產的資料,生產者也有可能在消費者還未取走前一條資料的前提下繼續生產,這樣就會造成混亂。
為了克服這種混亂,生產者執行緒必須等待,知道消費者取走之後通知生產者,等待解除,可以生產。如果生產者未生產資料,消費者就要一直等待,直到生產者生產完畢,喚醒消費者執行緒,取走生產好的資料。
以下為**實現:
public
class
producerconsumer
}class
sharestorage catch (interruptedexception e)
}this.c = c;
flag = false;//設定標誌位為false,告訴消費者可以消費,此時生產者等待
notify();
}synchronized char getsharedata() catch (interruptedexception e)
}flag = true;
notify();
return c;
}}class
producer
extends
thread
@override
public
void run()
}}class
consumer
extends
thread
@override
public
void run() while (ch != 'z');
}} 此時的輸出結果可能為:
o,生產者生產
o,消費者消費
p,生產者生產
p,消費者消費
或者
a,生產者生產
b,生產者生產
a,消費者消費
b,消費者消費
這樣的輸出並不表示消費者和生產者執行緒沒有同步,這是因為setsharedata(),getsharedata()之後的輸出沒有被同步造成的結果,為了解決這個問題,加上同步塊就可以完美解決這個問題了。見下面修改後的**:
public
class
producerconsumer
}class
sharestorage catch (interruptedexception e)
}this.c = c;
flag = false;//設定標誌位為false,告訴消費者可以消費,此時生產者等待
notify();
}synchronized char getsharedata() catch (interruptedexception e)
}flag = true;
notify();
return c;
}}class
producer
extends
thread
@override
public
void run() }}
}class
consumer
extends
thread
@override
public
void run()
} while (ch != 'z');
}} 輸出結果:
a,生產者生產
a,消費者消費
b,生產者生產
b,消費者消費
c,生產者生產
c,消費者消費
d,生產者生產
d,消費者消費
e,生產者生產
e,消費者消費
...
生產者消費者 生產者與消費者模式
一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...
生產者消費者
using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...
生產者消費者
執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...