生產者消費者

2021-08-02 00:08:58 字數 2039 閱讀 2421

生產者和消費者是一種經典的供求案例,生產者和消費者執行緒之間的關係涉及執行緒之間的互動。生產者執行緒產生的資料項,將來會被消費者消費,每個生產出來的資料會被儲存在乙個共享的倉庫中。

假設執行緒以不同的速度進行,那麼將會導致消費者可能獲取到還未生產的資料,生產者也有可能在消費者還未取走前一條資料的前提下繼續生產,這樣就會造成混亂。

為了克服這種混亂,生產者執行緒必須等待,知道消費者取走之後通知生產者,等待解除,可以生產。如果生產者未生產資料,消費者就要一直等待,直到生產者生產完畢,喚醒消費者執行緒,取走生產好的資料。

以下為**實現:

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 喚...